Spring4基础 学习笔记(1) ---- Bean
文章为博主看动力节点Spring教学视频总结的笔记,作为以后查阅使用。
Spring主要作用为“解耦”
根据功能不同可以将系统中的代码分为:
主业务逻辑
系统级业务逻辑:没有具体的专业业务应用场景,为主业务提供系统级服务,例如日志、安全、事务等
Spring根据代码功能特点,将降低耦合度方式分为两类:
IoC与AOP
IoC使得主业务在相互调用过程中不用再自己维护关系,即不用再自己创建要使用的对象了。而是有Spring容器统一管理,自动“注入”。
AOP使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务混杂到主业务逻辑中了,而是由Spring容器统一完成“织入”。
Spring作为一个容器,可以管理对象的生命周期、对象和对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。
IoC(Inversion of Control)
AOP(Aspect Orient Programming)
IoC:
依赖查找:JNDI
依赖注入
配置文件:applicationContext.xml(名字随意,官方建议)
applicationContext容器和BeanFactory容器区别:
前者在初始化时创建对象,后者在使用时创建
Bean的装配(创建)
默认装配方式:getBean的时候调用无参构造器(没有会出错)
动态工厂bean:
<bean id="factory" class="Dynamic_Bean_Factory.ServiceFactory"/>
<!-- someSerice对象是由对应工厂对应方法创建 -->
<bean id="someService"factory-bean="factory"factory-method="getSomeSevice"/>
对象由工厂创建但是代码里没有工厂,在配置文件里配置
ISomeService service = (ISomeService) ac.getBean("someService");
静态工厂bean:
工厂创建bean方法为static的
<!-- 由class对应工厂的对应静态方法创建的对象 -->
<bean id="someService" class="Static_Bean_Factory.ServiceFactory" factory-method="getSomeService"/>
ISomeService service = (ISomeService) ac.getBean("someService");
Bean的作用域:
1.prototype原型模式:每次getBean都会创建新的Bean,且在使用的时候才会创建
<bean id="someService" class="service.ISomeServiceImpl" scope="prototype"/>
2.singleton单例模式:每次getBean都是同一个对象,初始化applicationContext容器时候创建(默认值)
3.request:对于每次http请求都产生不同Bean
4.session:对于不同的session有不同的Bean
注:对于scope的值request、session、global session只有在Web应用中使用Spring时,才有效。
Bean后处理器:是一个特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法。
由于该Bean由其他Bean自动调用,所以该Bean没有Id。
两个方法:参数1初始化的bean,参数2beanName和bean的id属性对应
//bean初始化完成之前
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//bean初始化完成之后
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
Bean后处理器的应用:
1.修改after方法的返回值为bean的代理对象实现增强
2.为特定的bean增强:增加Condition:判断beanName
bean的初始化前和销毁前可以调用bean的方法:
init-method="" destroy-method=""/>
其中销毁方法的执行有两个要求:
1)被销毁的对象需要是singleton
2)容器要显式地关闭
对象默认是singleton的;appplicationContext接口没有定义关闭方法,定义在实现类中,需要将applicationCnotext强转:
((ClassPathXmlApplicationContext)ac).close();
Bean的生命周期(可控点):
1.bean的无参构造器
2.属性的setter
<bean id="someService" class="lifeOfBean.ISomeServiceImpl" >
<property name="adao" value="AAA"/>
<property name="bdao" value="BBB"/>
</bean>
3.如果bean实现了beanNameAware接口:
@Override
public void setBeanName(String name) {
// TODO Auto-generated method stub
System.out.println("Step3 : beanName = " + name);
}
4.如果bean实现了BeanFactoryAware接口:
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
System.out.println("Step4 : 获取到beanFactroy");
}
5.bean后处理器的before方法
6.如果bean实现了InitializingBean接口:
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("Step6 : InitializingBean接口的afterPropertiesSet方法");
}
标志着bean的初始化工作完成
7.bean配置的init-method方法:
<bean id="someService" class="lifeOfBean.ISomeServiceImpl" init-method="init_method">
8.bean后处理器的after方法
9.bean的主业务方法
10.如果bean实现了DisposableBean接口(Disposable:一次性):
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("Step10 : ");
}
这个方法的执行需要对象是单例的和容器手工关闭
11.bean配置的destory-method
匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id
内部bean:将bean放在property内,id为property的name :
<bean id="stu" class="di01.Student">
<property name="">
<bean class=""></bean>
</property>
</bean>
匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id
内部bean:将bean放在property内,id为property的name :
<bean id="stu" class="di01.Student">
<property name="">
<bean class=""></bean>
</property>
</bean>
同类抽象bean:
bean可以继承另一个bean:
<bean parent="">会继承parent的class和property
用来被继承的bean没有意义,将abstract属性定义为true
异类抽象bean:
被继承的bean没有class属性,必须将abstract定义为true
如有错误,欢迎指正。