一:xml方式实现配置
方法注入:lookup方式配置xml文件bean中实现自动生成接口的实例方法达到bean的prototype模式(每次调用生成一个新的依赖对象,依赖对象本身需要标注为prototype)。另外一种方式是重新定义一个类继承MethodReplacer接口,并返回需要的依赖对象,在配置bean时指定用<replaced-method>标签替换达到每次重新生成一个依赖对象。
【lookup方式有一定的适用范围,因为很好定义一个接口的实现类,在实现类中用属性注入的方式很容易达到相同目的】
作用域:singleton,prototype,session,request,globalsession后面3个是基于webapplicationcontext。
使用后面3个作用域需要配置listener,在web.xml文件中配置
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
作用域依赖问题:域之间跨依赖对象需要使用AOP解决。使用方式是宿主对象正常模式配置bean和对应的依赖项,被注入对象需要设置具体的域如:scope=“request”,在标签内部使用<aop:scoped-proxy/>创建代理对象,这样singleton对象就能通过代理判断在哪个线程中,并获取该线程下的对象。此处使用的原理是aop动态代理技术首先创建引用对象的代理,在注入到宿主对象时已经不是原来的对象类型了,已经变成注入的是代理对象,在代理对象内部spring做了一些逻辑,以判断当前宿主对象应该从哪个http请求中获取对象。(该标签也适用于singleton获取prototype对象)
【实现逻辑很简单,先判断宿主对象在哪个线程中,然后在该线程中找到对应的域对象比如:httprequest,然后在该对象中找到具体的注入对象】,由于java要求只能给接口创建动态代理,如果要给类添加动态代理需要添加CGLib的jar包
二:注解方式实现配置
注解关键词:
@Component相当于xml中的bean开始,是注解方式的总描述,以下三个是针对@Component的分类标注
@Repository:针对DAO实现类标注
@Service:对service实现类标注
@Controller:对controller实现类标注
可以在配置文件中使用context命名空间的component-scan对标注了以上关键字进行扫描,通过base-package制定需要扫描的包。
使用@Autowired按照类型在spring容器中查找自动装配的依赖对象并装入。如果容器中有多个按照类型匹配的bean@Qualifier可以实现进一步按照名称筛选。@Scope定义bean的作用域,bean在自动装配时和容器销毁时提供了响应方法的调用:@PostConstruct(自动装载前),@PreDestroy(容器销毁前)。