IOC
控制反转,把创建对象的权力交给框架,是框架的重要特征。它包括依赖注入和依赖查找。
依赖注入的方式:构造方法注入;set方法注入;注解注入(@Resource和@Autowired)
@Resource和@Autowired区别
@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用。
@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象。
可能是由于我开发用到的@Autowire比较多,所以我更倾向于@Autowire,第一是:因为平时我们在项目中不会有两个相同类型的类,不用考虑名字的命名问题;第二:@Autowire是spring中的注解,而@Resource是属于J2EE的,spring框架当然使用自己的注解更好些。
IOC过程
ClassPathResource resource = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader =new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
factory.getBean("beanName");
1.定义好Spring的配置文件;
2.通过Resource对象将spring配置文件进行抽象,抽象成一个Resource对象;
3.定义好Bean工厂(各种BeanFactory);
4.定义好XmlBeanDefinitionReader对象,并且将工厂作为参数传递进去供后续回调使用;
5.通过XmlBeanDefinitionReader对象读取之前抽象出的Resource对象(包含XML文件的解析过程);
6.本质上,xml文件的解析是由xmlBeanDefinitionReader对象交由BeanDefinitionParserDelegate委托来完成,实质上这里面使用到了委托模式。
7.IOC容器创建完毕,用户可以通过容器读取所需要的对象信息。
大白话:
1.Spring的bean实际上是缓存在CurrentHashMap对象中。
2.在创建bean之前,首先需要将该bean的创建标识设定好,表示该bean已经或即将被创建,这样增加缓存的效率。
3.根据bean的scope属性来确定是singleton还是prototype等范围,然后创建相应的对象。
4.通过反射来创建bean的实例,在创建之前首先要检查访问修饰符,如果不是public的,则调用setAccessible(true)来突破限制。使得可以通过私有的构造方法创建对象实例。
5.接下来,寻找bean的属性值,完成属性的注入。
6.将创建出来的singleton对象添加到缓存中,供下次调用使用。
AOP
join point(连接点):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现aop时,并不需要去定义一个join point。(, Joint point
是所有可能被织入 Advice
的候选的点,在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point
)
Advice(通知):定义在连接点的行为,围绕方法调用而进行注入方法或者行为。(@before @after 等等这些方法)
aspect(切面):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。
Point cut(切点):确定在哪些连接点处应用通知。(符合要求的一些方法,给这些方法施加advice通知)
Advisor(通知器):组合advice与pointcut。
aop实现方式
JDK动态代理(JdkDynamicAopProxy):如果被代理的这个类有实现接口,则用JDK动态代理的方式实现。(和目标类实现同一个接口的方法增强)
CGLIB(CglibProxyFactory):如果被代理的这个类没有实现接口,则用CGLIB库实现。(生成目标类的一个子类实现方法的增强)