SpringInAction4笔记——装配

重点:常用的上下文环境

AnnotationConfigApplicationContext

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext


AnnotationConfigWebApplicationContext

XmlWebApplicationContext

 

1.常用的注解

 

显示装配的@Bean,需要和@Configuration配合使用

1、用到任意方法,告诉Spring这个方法将会返回一个对象,该对象要注册成为Spring应用上下文中的bean,默认情况下,bean的ID就是@Bean注解的方法名。

2、Spring会拦截所有对该方法的调用,并直接返回该方法所创建的bean

 

java配置和xml配置 混合装配

 

java的某个配置类中:

@Import(xxxConfig.class)
@ImportResource("classpath:xxxConfig.xml")


XML的某个配置文件中:
<bean class="xxxConfig.class">
<import resource="xxxConfig.xml">

 

自动装配的使用流程:

1、@ContextConfiguration(classes=CDPlayerConfig.class)

2、@ComponentScan//CDPlayerConfig上面,表示扫描组件,可以指定范围,不指定范围则扫描配置类所在的基础包

3、@Component //被注入的类上使用

4、@Atuowired //注入时使用

 

自动装配的歧义性

@Autowired是spring的元注解,可以用java的@Inject替代,先按类型找,如果找不到或者有多个,就按照name找,(扫描时默认是把类名第一个字母小写作为name)

可以用@Qualifier来指定name,或者把变量名改成扫描时生产的name

解决自动装配的歧义性,可以通过

@Qualifier 推荐用这个,设置一个代表性的名字

@Primary 

 

 

环境与profile

@Profile("dev"),可以用到类上和方法上,可以使用"!",该注解是使用@Conditional注解实现的。

@ActiveProfiles("dev","!test")

 

bean的作用域@Scope

单例(Singleton):在整个应用中,只创建一个实例

原型(Prototype):每次注入或者通过Spring应用上下文获取时,都会创建一个新的bean实例

会话(Session):在Web应用中,为每个会话创建一个bean实例

请求(Request):在Web应用中,为每个请求创建一个bean实例

 

对于Session和Request作用域,需要设置proxyMode,因为该作用域的对象注入单例时,注入的是一个代理,运行时再委托给相应的实例。

如果Session作用域的是一个借口的话,可以用proxyMode = ScopedProxyMOde.INTERFACES,

如果是一个具体的类的话,需要设置为proxyMode = ScopedProxyMOde.TARGET_CLASS。

 

注入外部的值

@PropertySource("classpath:/com/soundsystem/app.properties")

 

@Autowired

Environment env

 

解析属性占位符${...}

@Value("${disc.title}") String title;

 

SpEL表达式#{...},支持类型安全运输符 "?."

访问类作用域的方法和常量,需要依赖T关键字,比如#{T(System).currentTimeMillis()}

使用@Value注解来调用${...}和#{...}

@Value("#{systemPrpperties['disc.title']}") String title

 

 

 

 

 

 

 

 

 

 

 

 

  @Autowired

  @Qualifier("sgtPeppers" )

  private CompactDisc sgtPeppers;

 

@Component

 

 

@Configuration

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes=CDPlayerConfig.class)

 

 

xml用构造器注入时,

<constructor-arg value="The Beatles" />

或者用c语法

 

 

<bean id="compactDisc" class="soundsystem.BlankDisc"

 

        c:_0="Sgt. Pepper's Lonely Hearts Club Band" 

 

        c:_1="The Beatles" />

 

        

 

  <bean id="cdPlayer" class="soundsystem.CDPlayer"

 

        c:_-ref="compactDisc" />

 

 

注入属性时:

<property name="artist" value="The Beatles" />

或者用p语法

 <bean id="compactDisc"

        class="soundsystem.properties.BlankDisc"

        p:title="Sgt. Pepper's Lonely Hearts Club Band"

        p:artist="The Beatles"

        p:tracks-ref="trackList" />

 

<util:list>等来将bean中的复杂的参数移到外面去,保持xml代码的易读性

 

 

xml中引用其他xml文件

 

<import resource="cd-config.xml">

 

可以使用<bean class="xxx.xx">把javaConfig类导入到XML文件中

 

javaConfig中引用其他配置

 

 

@Configuration

 

@Import(CDPlayerConfig.class)

 

@ImportResource("classpath:cd-config.xml")

 

public class SoundSystemConfig {

 

 

 

}

 

 

 

无论怎么引用,只要在root配置中启用组件扫描即可

比如@ComponentScan和<context:component-scan >

 

配置多个可互相替代的bean时,比如DataSource

java配置:

 

 

@Profile("dev")

xml配置

<beans profile="dev">

 

 

使用时通过@ActiveProfiles来选择用哪个

 

@ActiveProfiles("prod")

 

 

也可以在

在web.xml中,配置

<context-param>

<param-name></param-name>

<param-value></param-value>

</context-param>

 

按条件注入Bean

 

 

1、@Bean

@Conditional(MagicExistsCondition.class)

 

 

 

 

2、public class MagicExistsCondition implements Condition

 

 

Bean的作用域

 单例 Singleton

原型 Prototype

会话 Session

请求 Request

 

 

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

 

 

 

<bean class="com.myapp.Notepad" scope="prototype" />

 

 

会话 Session和请求 Request需要设置代理proxyMode,

如果是xml配置,bean中加入<aop:scoped-proxy>

 

 

生命周期 

1.实例化

2.为属性赋值

3.BeanNameAware接口

4.BeanFactoryAware接口

5.ApplicationContextAware接口

6.BeanPostProcessor接口

7.InitializingBean接口

8.DisposableBean接口

 

 

 


引入properties文件

 

 

 

<context:property-placeholder location="classpath:system.properties" />

 

 

 

java配置

 

@PropertySource("classpath:/com/soundsystem/app.properties")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2017-08-07 10:31  lakeslove  阅读(239)  评论(0编辑  收藏  举报