bean的生命周期
1、singleton:单例,系统在运行中只有一个实例
在加载spring容器时候将bean实例化好了,只实例化一次。
spring容器对bean的管理默认就是单例。
2、prototype:多例,每次访问都要创建一个实例。
调用applicationContext.getBean方法时,都会创建一个实例。
重点:!!!
Dao:单例,在dao不要添加具有状态的属性(数据域的成员变量)
Service:单例,在Service不要添加具有状态的属性(数据域的成员变量)
Action:多例
Servlet:单例
当类线程安全时可以用单例,没有数据域的成员变量(具有状态0-1||’0’-’1’的属性)
注解
在spring中提供了@component标识就是一个bean。
@Component可以用在任何的bean上。
各个注解可以任意用,但为了开发规范,统一注解标注。
@Autowired:按类型注入
1、可以标识在属性上,根据属性类型去spring容器中找同类型的bean,找到则将bean注入到属性中。
@Autowired//按类型注入
private CustomerDao customerDao;
注意:如果容器中同一个类型的bean如果有多个,使用Autowried报错,找到多个同类型的bean,使用@Qualifier和Autowired配置,Qualifier指定将哪个bean注入进来。
@Resource:按名称注入
和autoWired区别:Resource注解是jdk下的,而autoWired是spring提供。
@Transactional:在service方法上使用@Transactional标识此方法进行事务控制
组件扫描
component-scan可以扫描注解:@controller、@Service、@Repository、@Component
指定扫描的包cn.itcast.crm,可以扫描子包下的类
<context:component-scan base-package=“cn.itcast.crm”></context:component-scan>
原理:
在加载spring容器时,根据上边配置的包路径,扫描包下的及子包下的类,如果标识了:@controller、@Service、@Repository、@Component进行实例化。
Context:annotation-config配置的使用:为了激活autowire和qualifier注解。
和context:component-scan配置的区别是,后者的范围大。全部注解的包括。
spring和struts2整合
创建action的实例改为StrutsSpringObjectFactory工厂,创建逻辑为:
struts2框架将beanname先从spring容器中找有没有这个bean,如果有从容器中取,如果没有再自己创建。
配置jdk或cglib
在aop代理配置处,可以通过proxy-target-class控制使用的代理方式:
proxy-target-class=false 默认值,使用jdk代理
aop代理配置
<aop:config proxy-target-class=“false”>
proxy-target-class=true 使用cglib代理
<aop:config proxy-target-class=“true”>
jdk:基于接口生成代理对象
根据接口方法生成代理对象,对原来的代理对象进行增强
使用jdk提供反射实现
cglib:基于类生成代理对象
根据类生成一个子类(代理对象),在代理对象(子类)中对父类进行增强。
使用CGLib实现
spring底层使用jdk和cglib,如果原始对象实现了一个接口,spring使用jdk,否则 使用cglib生成代理。
如果此类没有实现接口,只能使用cglib代理!!!