spring 框架学习(最重要的是:学习各个配置)
AOP:
spring 提供了proxyFactoryBean.只需配置而不需要写,使用到动态代理技术。
通过代理接口,完成代理任务(织入通知)。
spring框架的五种通知:
前置通知:(Org.springframework.aop.methodBeforeAdvice):在目标方法前调用通知
后置通知:在目标方法后调用通知
环绕通知:拦截对目标方法调用
异常通知:当目标方法抛出异常时自动调用
引入通知:需求-->希望只在调用某一方法的时候才进行前置通知-->这时候需要用引入通知
---配置前置通知的切入点,使它只对某一方法生效
---如果不配置,则它某认对所有方法生效
编程说明:
1 定义接口
2 编写对象(被代理的对象=目标对象)
3 编写通知(前置通知)
4 在beans.xml文件中配置
-配置被代理的对象
-配置通知
-配置代理对象 是ProxyFactoryBean的对象实例
-<!--配置代理接口集-->(对这里的方法产生影响)
-<!--配置织入(前置/后置/环绕)通知-->(例如写日志的方法)
-<!--配置被代理对象-->
SPRING
开发一个Spring项目
1 引入spring包(spring.jar commons-logging.jar)
2 创建spring的一个核心文件 applicationContext.xml,[hibernata有核心hibernata.cfg.xml
struts核心文件 struts-config.xml],该文件一般放在src目录。
spring框架什么时候被加载?spring中配置的bean怎样被创建,bean与bean之间的关系怎样被维护?
当ApplicationContext ac=new ClassPathXmlApplicationContext(applicationContext.xml);
被执行时,spring容器对象被创建,同时applicationContext.xml中配置的bean就会被创建
(内存[hashmap/hashtable])。
IOC
ioc全称:inverse of control,控制反转。所谓控制反转就是把创建对象,和维护对象
的权利从程序中转移到spring容器(applicationContext.xml)中了,而程序本身不再维护。
DI是什么?
di(dependency injection)依赖注入。和IOC一个意思。spring设计者认为di能更准确表示spring核心技术。
spring开发提倡接口编程,配合DI技术,可以更好的解决层与层之间的解耦。(接口由spring管理)
BEAN
配置bean
从ApplicationContext应用上下文获取bean,和从bean工厂里面获取bean有什么区别?
当装载beans.xml的时候,里面配置的单例的bean(非单例的bean不会预先被实例化)就会被实例化(该bean scope是singlton);
特点:不管用不用bean,都被实例化了。(好处是可以预先加载,缺点是耗内存)
如果使用BeanFactory去获取bean,当只是实例化了工厂,那么工厂中的bean不被实例化,只有当使用某个
bean时(getBean)才会被创建。
特点:BeanFactory相较节省内存。
规定:一般没有特殊要求,应当使用ApplicationContext完成。
bean(ApplicationContext获取bean)的生命周期:
1 实例化:
当程序加载beans.xml文件的时候就发生了,把bean(前提是scope=singlton)实例化内存中了。
2 设置属性值(spring自动调用属性的set方法设置值)
3 如果实现了BeanNameAware接口,则调用setBeanName可以得到实例化的id号
4 如果实现了BeanFactoryAware接口,则调用setBeanFactory可以得到Bean工厂
5 如果实现了ApplicationContextAware接口,则调用setApplicationContext可以得到上下文
6 如果bean.xml中配置了BeanPostProcesser后置处理器,则对bean实例化时会自动调用
ObjectpostProcessBeforeInitialization
---对所有的实例化对象进行相同的预处理
7 如果实现InitializingBean接口 调用afterPropertiesSet()方法
8 配置init-method,使用定制化的初始化方法
9 如果bean.xml中配置了BeanPostProcesser后置处理器,调用ObjectpostProcessBeforeInitialization方法
10 可以使用Bean了
11 容器关闭
12 实现接口DisposableBean,调用destory方法销毁
13 不使用11,配置distory-method,定制销毁方法
(注1:实际开发中: 1-->2-->6-->9-->10-->11)
(注2:通过beanFactory来获取bean对象,bean的生命周期少几步)
装配Bean
尽量不要把bean配置为prototype,除非有必要
可以通过注解的方式来配置哪个方法为init-method,注解PostConstruct
可以通过注解的方式来配置哪个方法为destory-method,注解preDestroy
<property>通过调用set方法来实现注入
除了通过set方法注入还可以通过构造函数注入
自动装配(autowire)bean的属性值
no 不自动装配
byname 寻找和属性名相同的bean,若找不到,则装不上
byType 寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常
constructor 查找和bean的构造参数一致的一个或多个bean,若找不到或找到多个,抛异常
autodentect byType和constructor之间选一个方式
default-autowire 在<beans>中指定,对所有bean生效 默认值是no
启用注解
<context:annotation-config /> 改配置可激活在类中探测到的各种注解
使用spring特殊的bean:
实现了的后置处理器