第二讲
一、两种后处理器:spring允许通过后处理器对IOC容器进行扩展。
- Bean后处理器:对容器中的Bean进行后处理,对Bean进行额外的加强。
- 需要实现一个接口BeanPostProcessor接口,包含两个方法:
Object postProcessBeforeInitialization(Object bean,String name)
和Object postProcessAfterInitialization(Object bean,String name)
- 需要实现一个接口BeanPostProcessor接口,包含两个方法:
- 容器后处理器:对IOC容器进行后处理,用于增强容器功能。
- 需要实现接口
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
,无返回值。
- 需要实现接口
二、注解
@Component
:注释一个普通的spring bean类。@Controller
:标注一个控制器组件类。@Service
:标注一个业务逻辑组件类。@Repository
:标注一个DAO组件类。
三、使用注解的时候,需要在xml中配置扫描的路径(包的路径):<context:component-scan base-package=”cc.wsyw126”/>
四、可以在component-scan中使用
<context:include-filter type=”regex” expression=”.*Chinese”/>
:指定满足该规则的Java类会被当做一个bean类被管理。<context:exclude-filter type=”regex” expression=”.*Chinese”/>
:指定满足该规则的Java类不会被当做一个bean类被管理。
五、使用@Scope(“prototype”)
来标注bean的作用域为prototype。默认为singleton。
- 也可以自定义解析器实现ScopeMetadataResolver接口,并提供自定义的作用域解析策略,然后在配置扫描器时指定解析器的全限定类名即可:scope-resolver=”全限定类名”
六、@Resource(name=”id”)
:配置依赖。
- 可以标注在setter方法上。省略name属性时,name属性的值为去掉set,首字母小写后得到的字符串。
- 也可以标注在实例变量上()。省略name属性时,name属性的值为同实例变量同名。
七、生命周期行为
@PostConstruct
:作用同init-method。@PreDestroy
:作用同destroy-method。
八、@DependsOn(“一个或多个依赖的对象ID”)
:用于强制初始化其他Bean。
九、@Lazy(“一个boolean型的值”)
:用于指定Bean是否取消预初始化。
十、@Autowired
:可以修饰setter方法、普通方法、实例变量、构造器等。
- 当Autowired修饰setter方法时:默认采用byType自动装配策略。
- 找到一个,注入;多个,报异常;没有,什么都不做;
- Spring4.0之后的Autowired可以根据泛型进行自动。
- 修饰类A的集合属性时,spring会搜索容器中类A所有的实例,并以这些实例创建集合。
- 使用
@Autowired
和@Qualifier(“bean的ID”)
可以根据指定的Bean的ID进行装配。(不如直接使用@Resource
执行依赖注入)
- @Qualifier可以和@Autowired一起放在实例变量之上,也可以不放在一起,放在setter的参数之前,而@Autowired放在实例变量之上。
十一、资源访问:访问各种类型的文件、二进制流等。
- UrlResource:访问网络资源的实现类。
- ClassPathResource:访问类加载路径里资源的实现类。
- FileSystemResource:访问文件系统里资源的实现类。
- ServletContextResource:访问相对于ServletContext路径下的资源的实现类。
- InputStreamResource:访问输入流资源的实现类。
- ByteArrayResource:访问字节数组资源的实现类。
十二、Spring提供了ResourceLoader和ResourceLoaderAware接口,在实现类中有getResource(String location)
方法,获取Resource实例。
十三、访问资源时,也可以不理会ApplicationContext的实现类,强制指定ClassPathReource、FileSystemResource等实现类。通过不同的前缀指定:
- classpath:以ClassPathReource实例访问本地文件系统的资源。
- file:以UrlResource实例访问本地文件系统的资源。
- http:以UrlResource实例访问基于http协议的网络资源。
- 无前缀:由ApplicationContext的实现类来决定访问策略。
- 例子:
Resource r = ctx.getResource(“classpath:beans.xml”);
十四、使用Resource作为属性:使用依赖注入。在xml配置中添加p:res=”classpath:beans.xml”
。
十五、在ApplicationContext中使用资源:
- 使用ApplicationContext实现类指定访问资源。
- 使用前缀指定访问资源。
“Classpath*:beans.xml”
:提供加载多个XML配置文件的能力。系统将搜索类加载路径,找出与文件名匹配的文件,分别加载文件中的配置,最后合并为一个ApplicationContext。注意:该方法仅对ApplicationContext有效,对Resource实例无效。- “file:xxx”前缀:来区分相对路径和绝对路径。
new FileSystemXmlApplicationContext(“file:beans.xml”);
相对路径。new FileSystemXmlApplicationContext(“file:beans.xml”);
绝对路径。
参考资料:
轻量级Java EE企业应用实战(第4版)
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/51744375
作者:WSYW126