一、 Spring的装配bean的三种方式: 1、xml显示配置2、java中显示的配置 3、隐式的bean发现和自动装配
二、 自动化装配bean方式:
1、组件扫描:Spring会自动发现应用上下文的创建的bean。
a、开启组件扫描的方式:注解@ComponentScan 或 xml配置<context:component-scan>。
b、@Component : 声明创建bean,为bean命名。(@name 功能相同)
c、@ComponentScan设置组件扫描的基础包;basePackage,basePackageClasses。
2、自动装配:Spring自动满足bean之间的依赖。
a、注解@Autowire, 可以在构造器,setter方法等类的任何方法上。属性设置required=false ,需要在代码进行null检查。
b、@Inject 用法和autowire基本相同。
三、 java代码装配bean :1 创建配置类@Configuration ;2 使用@Bean 。 java装配bean 赋予bean生成方式的灵活性:如 多个类型的bean生成返回。
四、 Spring bean 注入方式:
1 使用java configer 方式配置 @Bean注解(带有该注解的方法可以采用任何必要的java功能来产生bean 的实例,构造器和setter方法只是简单的两个java方式)。
2 xml配置: 1 使用<constructor-arg>: 便于接收集合参数<set>和<list>
2 使用c-命名空间方式
3 P-命名空间、util-命名空间。
混合配置:xml和javaConfig配置互相引用。
javaConfig导入:配置类(@Import(Person.class))和xml方式( @importResource("classpath:pe-config.xml"))。
xml导入:配置类(<bean class="cn.spring.Preson">)和 xml方式(<import resource="pe-config.xml">)
五、环境和Profile: 1、 java 配置方式: @Configuration xml方式:<beans profile = "dev">......</beans>
@Profile("dev")
2、激活profile 1 作为DispatcherServlet的初始化参数。 2 web的上下文,等等。
3、 条件化配置bean: @Conditional, @Profile(基于@Conditional 和Condition)
4、 处理自动装配歧义: 1 标示首选bean(@Primary); 2 限定自动装配的bean(@Qualifier("iceCream"))
3 使用自定义:更具特征性和描述性术语。
六、bean的作用域
单例:整个应用只创建一个bean实例。(默认)
原型:每次注入或通过Spring上下文获取的时候都新建一个bean实例。(@Scope(ComfigurableBeanFactory.SCOPE_PROTOTYPE),或@Scope("prototype"),第一种更安全)
会话: web应用中,为每个会话创建一个bean实例。
请求: web应用中,为每个请求创建一个bean实例。
问题1:实现单例中注入会话中的bean。
{ 作用域代理能够延迟注入请求和会话作用域的bean}
1、java配置方式:@Scope(WebApplicationContext.SCOPE_SESSION,
proxyMode=ScopedProxyMode.IINTERFACES(基于接口的代理)或proxyMode=ScopedProxyMode.TARGET_CLASS基于类的代理(cglib)) ;
2、xml方式(需要在xml配置aop的名称空间):
<bean id="person" class="cn.person" scope="session">
<aop:scope-proxy proxy-targer-class="fase">
<bean>
默认使用cglib代理, 配置proxy-targer-class="fase"则使用接口代
七、运行时的值注入
1 Spring提供两种运行时求值方式: 1 属性占位符 ; 2 Spring表达式语言(SpEL)。
2 注入外部值:
1 声明属性源,并通过Spring的Environment来检索属性。
使用@PropertySource注解:如 @PropertySource("classpath:/com/spring/app/properties"),属性文件会加载
到Spring的Environment中,之后可以从这里检索属性。
Spring Environment : 1、 String getProperty( String key)
2、 String getProperty(String key, String defaultValue)
3 、T getProperty(String key, Class<T> type)
4、T getProperty(String key, Class<T> type, T defaultValue)
5、 getRequiredProperty(), 属性必须定义, 否则抛异常。
6、 检查属性是否存在: containsProperty()。
7、将属性解析为类 : getPropertyAsClass()。
8、String [ ] getActiveProfiles( );返回激活profile名称数组。
9、 String [ ] getDefaultProfiles( ): 返回默认Profile名称数组。
10 、 boolean acceptProfiles( String ... profiles ) : 判断environment 是否支持给定的profile。
a、Spring占位符 使用: 1 使用“${ . . . }”; 2 使用@Value注解 。
使用占位符:必须要配置PropertyPlaceholderConfigurer bean或 PropertySourcesPlaceholderConfigurer bean;
推荐使用第二个,因为它能基于spring Environment 及其属性源来解析占位符。
b、Spring 语言表达式: SpEL要放到“#{ . . . }”中