- 浏览: 26367 次
- 性别:
- 来自: 北京
最新评论
-
bxf12315:
晕了,怎么能吧这篇文章转到论坛里啊!
如何借助“策略模式”才能避免程序中的if else -
bxf12315:
哦 ror我还没搞过。这个只是想用来带着我负责项目组的成员学学 ...
基于URL的契约式简易MVC框架 -
linhong_1001:
怎么都像是ROR,Grails就是这样做的
基于URL的契约式简易MVC框架 -
fmjasper:
你确定这个程序能通过? 不会跑出access exceptio ...
可更新的注册式的单实例模式 -
chian_xxp:
能否请楼主简要介绍下RegSingleton 类中static ...
可更新的注册式的单实例模式
这段时间,想学习些关于IOC和反射以及注释方面的东西。
想通过一个简单的例子来学习一下,我设想的例子是这样的。
1 首先 通过castor来读取bean配置信息
2 然后注册bean的class信息到容器中。
3 在client获取bean的时候,去检查bean是否需要通过代理来实现
4 然后分配不同的代理来实现一些诸如事务 log的功能。
这是一个初步的想法,但是我知道ioc容器应该不止是实现一个简单的反转控制的问题,希望能在以后加进去(说实话,还有点啥我都不知道)。
1 bean配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <mybeans >
- <bean id="first" name="first" implement="com.my.ioc.testpackage.MybeanOneImpl"></bean>
- </mybeans>
只是用最简单的一个描述。应该一眼能看出来。
2 配置读取
2.1 使用castor读取xml的代码
- public class XmlToBean {
- public Mybean getBean() throws Exception {
- Mapping map = new Mapping();
- URL u = this.getClass().getClassLoader().getResource("com/my/ioc/config/config-mapping.xml");
- map.loadMapping(u);
- Unmarshaller un = new Unmarshaller(Mybean.class);
- File file = new File("myconfig.xml");
- file.getAbsoluteFile();
- Reader reader = new FileReader(file);
- // Unmarshaller unmarshaller = new Unmarshaller(map);
- un.setMapping(map);
- Mybean read = (Mybean) un.unmarshal(reader);
- return read;
- }
- }
2.2 castor 的配置文件
就是一个xml到bean的描述文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
- "http://castor.org/mapping.dtd">
- <mapping>
- <class name="com.my.ioc.config.Mybean" auto-complete="true">
- <map-to xml="my_beans" />
- <field name="mybeans" type="com.my.ioc.config.ConfigBean" collection="arraylist">
- <bind-xml name="bean" node="element" />
- </field>
- </class>
- <class name="com.my.ioc.config.ConfigBean" auto-complete="true">
- <field name="id">
- <bind-xml name="id" node="attribute"/>
- </field>
- <field name="name">
- <bind-xml name="name" node="attribute"/>
- </field>
- <field name="implement">
- <bind-xml name="implement" node="attribute"/>
- </field>
- </class>
- </mapping>
2.3 然后就是配置的bean了
好像介绍的顺序不太对。
- public class ConfigBean implements Serializable{
- private String id;
- private String name;
- private String implement;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getImplement() {
- return implement;
- }
- public void setImplement(String implement) {
- this.implement = implement;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- public class Mybean {
- private List<ConfigBean> mybeans;
- public List<ConfigBean> getMybeans() {
- return mybeans;
- }
- public void setMybeans(List<ConfigBean> mybeans) {
- this.mybeans = mybeans;
- }
- }
3 在写我的bean工厂前,还是说下我的annotation吧。
3.1 类的注释- 为了表明这个方法是否需要通过动态代理来处理
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- public @interface MyClassAnnotation {
- String isInvoke() default "NO";
- }
3.2 方法注释-来标明这个方法是否执行特定的业务,还是比如说事务。。。-_-!(感觉就这个好说点)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface MyMethodAnnotation {
- String isTransaction() default "NO";
- }
3.3 写一个简单的代理类
- class MyTranstionHandler implements MyHandler,InvocationHandler{
- private Object o;
- private MyJotmTranstion tra;
- public MyTranstionHandler(Object delegate) {
- o = delegate;
- // tra = new MyJotmTranstion();
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- Object a = null;
- try {
- if (method.isAnnotationPresent(MyMethodAnnotation.class)) {
- MyMethodAnnotation an = method.getAnnotation(MyMethodAnnotation.class);
- if (an.isTransaction().equals("yes") && an != null) {
- // getTransactionManager().begin();
- System.out.print("\n" + "start");
- a = method.invoke(o, args);
- // getTransactionManager().commit();
- System.out.print("\n" + "end");
- } else {
- a = method.invoke(o, args);
- }
- }
- return null;
- } catch (Exception e) {
- System.out.print("\n" + "invoke Exception");
- }
- return a;
- }
- private TransactionManager getTransactionManager()
- {
- return tra.getTransactionManager();
- }
- }
4 现在给出一个具体的实现类
- @MyClassAnnotation(isInvoke="yes")
- public class MybeanOneImpl implements IMybeanOne {
- @MyMethodAnnotation(isTransaction = "yes")
- public void printString() {
- System.out.print("\n"+" don some thing");
- }
- @MyMethodAnnotation(isTransaction = "yes")
- public void printString1() {
- System.out.print("\n"+" good work");
- }
- }
5 然后给出我的bean工厂了
- public class MyBeanFactory {
- private static MyBeanFactory instance = null;
- private MyBeanFactory() {
- try {
- initBean();
- } catch (Exception e) {
- int b = 0;
- }
- }
- public static MyBeanFactory getInstance() {
- return instance = new MyBeanFactory();
- }
- private Map<String, Class> beanMap = new HashMap<String, Class>();
- private Object getConfigBean() throws Exception {
- XmlToBean xml = new XmlToBean();
- return xml.getBean();
- }
- private void initBean() throws Exception {
- Mybean beans = (Mybean) getConfigBean();
- List<ConfigBean> configList = beans.getMybeans();
- for (int i = 0; i < configList.size(); i++) {
- ConfigBean bean = configList.get(i);
- registerBean(bean.getName(), bean.getImplement());
- }
- int i = 0;
- }
- private void registerBean(String beanName, String className) throws Exception {
- Class bean = Class.forName(className);
- beanMap.put(beanName, bean);
- }
- public Object getRegistedBean(String beanName) throws Exception {
- Class o = beanMap.get(beanName);
- if(o.isAnnotationPresent(MyClassAnnotation.class))
- return o.newInstance();
- MyClassAnnotation classAnn = (MyClassAnnotation) o.getAnnotation(MyClassAnnotation.class);
- if (classAnn.isInvoke().equals("yes")) {
- InvocationHandler handler = new MyTranstionHandler(o.newInstance());
- return Proxy.newProxyInstance(o.getClassLoader(), o.getInterfaces(), handler);
- } else {
- return o.newInstance();
- }
- }
- }
6 测试代码
- public static void main(String[] args) {
- MyBeanFactory f = MyBeanFactory.getInstance();
- try {
- IMybeanOne o =(IMybeanOne) f.getRegistedBean("first");
- o.printString();
- } catch (Exception e) {
- System.out.print("error "+e.getMessage());
- }
- }
呵呵最后是结构输出:
start
don some thing
end
这里我还是使用了xml来配置bean的信息。第一这种方式是我比较熟悉的 第二 我感觉这种方式还是比较灵活的。
然后,我把一些类似于横切面的业务放到了anntation中来处理,这个其实是我在开发中很希望能做到的。
比如事务,我就在方法上标上这个方法就是要执行事务就完了,或者要缓存。这样开发起来感觉简单快捷。(个人想法)
我通过配置信息把实现bean的class存放在一个map中在client调用的时候,判断是否通过代理实现在然后给出实例。
这些就是我的一个基本想法。(算是实现了)
这只是在学习,希望高人能给指点一二,然后我试着把这些想法完善。
评论
<p>从client是不会做释放对象的动作的,这个该怎么做呢?</p>
<p>以前用对象池,一般都是要先借后还的,但是现在这种方式怎么还呢? 这样是不是就需要起一个后台线程通过lru什么的来进行回收? 这下不明白的就更多了。</p>
<p>能给例子来学习一下吗? 比如说数据库连接池的对象回收。(看过几次pico,但是没看懂他的实现机制)</p></div><br/>数据库连接池的对象回收好像是在close的时候将connection回收的吧,显示通知管理器该connection已经不再使用。
但一般的javabean这样才算不再使用了呢?难不成还要咱们还要去内存看它是不是死节点?不明白
<p>从client是不会做释放对象的动作的,这个该怎么做呢?</p>
<p>以前用对象池,一般都是要先借后还的,但是现在这种方式怎么还呢? 这样是不是就需要起一个后台线程通过lru什么的来进行回收? 这下不明白的就更多了。</p>
<p>能给例子来学习一下吗? 比如说数据库连接池的对象回收。(看过几次pico,但是没看懂他的实现机制)</p>
鼓励造出超级“轮子”,如Spring,鄙视“锤子”,如EJB2。
<p>其实,ioc应该除了做反转控制外还应该有其他作用,比如说object的生命周期管理。其它的功能目前我还不知道,呵呵。</p>
<p>刚刚查了查,对于生命周期的管理可以分几个:单实例,每次请求产生一个新对象,对于每个线程一个单实例,对象池,另外可能有用户自定义。其实在上面做的只是实现了一个每次请求产生一个新对象。其他的完全没有实现,第一其它好多生命周期的管理的方式,我还太明白作用 第二 如何实现也不知道。</p>
<p>目前,对我来说还能进一步做的可能只有对象池了。</p>
<p>这方面的东西知识实在太有限了,希望大家给点意见,提供一些参考。(只是学习至于能否实现就不重要了呵呵)</p>
我也写过一个类似的IOC,完全使用annotation,功能也支持事务,不过只支持JDBC.
发表评论
-
Jvm内存分配(7)
2012-07-04 08:56 752下面的内容全部来自网 ... -
Jvm内存分配(6)
2012-07-04 08:57 758下面的内容全部来自网络,基本无原创。只是学习笔记而已。 ... -
Jvm内存分配(5)
2012-07-03 15:23 1263下面的内容全部来自网 ... -
Jvm内存分配(4)
2012-07-03 15:20 822下面的内容全部来自网络,基本无原创。只是学习笔记而已。 ... -
Jvm内存分配(3)
2012-07-03 15:14 874下面的内容全部来自网络,基本无原创。只是学习笔记而已。 ... -
jvm内存分配(2)
2012-07-03 15:11 761下面的内容全部来自网络,基本无原创。只是学习笔记而已。 ... -
jvm内存分配(1)
2012-07-03 15:10 767做个java程序员n多年了,一直以来没搞明白jvm的内存分配。 ... -
如何借助“策略模式”才能避免程序中的if else
2011-01-20 15:29 2083如何避免使用if else语句,这是个问题困扰自己很久了。 ... -
Annotation & Reflection 学习 及 问题
2007-11-26 14:27 1120最近在学习Anntation和Reflection,一直希望能 ...
相关推荐
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
手写SpringIoc的XML实现方式,仿照Spring底层Bean工厂类实现ClassPathXmlApplicationContext
仿照Spring写的一个Ioc容器,注释很详细!
使用反射技术和注解类实现手写SpringIOC,并使用SpringJDBC进行依赖注入测试。
NULL 博文链接:https://ziyoujiedao.iteye.com/blog/262360
手写的IOC,DI,只用到了javax.servlet.*下的包,没有其他工具包。本人手写,绝对可用,jdk1.8环境
微软内置ServerCollection和第三方Autofac IOC容器的使用,以及手动实现.(手动实现需要我后续完善,并没有写完整)
自己写了三个分别关于WEB,IOC,ORM的框架现将全部开源,内有说明文档,测试示例项目,框架源代码文件,sql语句等
模仿spring的配置,自己实现了一个简单的ioc,配置文件的dtd还没来得及写,不过无伤大雅O(∩_∩)O
本资源是个人手写spring ioc的源码,实现了ioc基本功能,解决了循环依赖,推动构造器,自动注入等
我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,...IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。
自己动手实现Spring IoC容器, 写Spring IOC容器.wps写Spring IOC容器.wps写Spring IOC容器.wps
以excel导入为例子,看看springIoc是什么原理,如何自己写一个
01-Spring源码手写篇-手写IOC.md
《仿 Spring 手写 IoC、AOP 框架》博客附件。 博客地址:https://blog.csdn.net/Supreme_Sir/article/details/109100886
学习Ioc,写的代码例子! 1:创建一个空的Java工程 2:释放压缩包后,并放入工程
【框架源码篇 01】Spring源码-手写IOC
简单手写的springIOC容器注解模式,仅供参考,欢迎指教。