首页 > 代码库 > SpringInAction4笔记——装配
SpringInAction4笔记——装配
重点:常用的上下文环境
AnnotationConfigApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigWebApplicationContext
XmlWebConfigApplicationContext
1.常用的注解
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } span.s1 { color: #000000 } span.s2 { color: #777777 } span.s3 { color: #931a68 } span.s4 { color: #0326cc }</style>
@Autowired
@Qualifier("sgtPeppers" )
private CompactDisc sgtPeppers;
@Component
@Autowired是spring的元注解,可以用java的@Inject替代,先安类型找,如果找不到或者有多个,就按照name找,(扫描时默认是把类名第一个字母小写作为name)
可以用@Qualifier来指定name,或者把变量名改成扫描时生产的name
解决自动装配的歧义性,可以通过
@Qualifier 推荐用这个,设置一个代表性的名字
@Primary
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 }</style>
@Configuration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
xml用构造器注入时,
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #4e9192 } span.s1 { color: #009193 } span.s2 { color: #000000 } span.s3 { color: #932192 } span.s4 { color: #3933ff }</style><constructor-arg value="The Beatles" />
或者用c语法
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; min-height: 17.0px } span.s1 { color: #009193 } span.s2 { color: #4e9192 } span.s3 { color: #000000 } span.s4 { color: #932192 }</style>
<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" />
注入属性时:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } span.s1 { color: #009193 } span.s2 { color: #4e9192 } span.s3 { color: #000000 } span.s4 { color: #932192 }</style><property name="artist" value="The Beatles" />
或者用p语法
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #932192 } span.s1 { color: #000000 } span.s2 { color: #009193 } span.s3 { color: #4e9192 } span.s4 { color: #932192 } span.s5 { color: #3933ff }</style><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中引用其他配置
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; min-height: 17.0px } span.s1 { color: #777777 } span.s2 { color: #931a68 } span.s3 { color: #000000 }</style>
@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
}
无论怎么引用,只要在root配置中启用组件扫描即可
比如@ComponentScan和<context:component-scan >
配置多个可互相替代的bean时,比如DataSource
java配置:
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 } span.s1 { color: #000000 } span.s2 { color: #3933ff }</style>
@Profile("dev")
xml配置
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #932192 } span.s1 { color: #009193 } span.s2 { color: #4e9192 } span.s3 { color: #000000 } span.s4 { color: #3933ff }</style><beans profile="dev">
使用时通过@ActiveProfiles来选择用哪个
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 } span.s1 { color: #000000 } span.s2 { color: #3933ff }</style>
@ActiveProfiles("prod")
也可以在
在web.xml中,配置
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
按条件注入Bean
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #777777 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } span.s1 { color: #777777 } span.s2 { color: #931a68 }</style>
1、@Bean
@Conditional(MagicExistsCondition.class)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } span.s1 { color: #931a68 }</style>
2、public class MagicExistsCondition implements Condition
Bean的作用域
单例 Singleton
原型 Prototype
会话 Session
请求 Request
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } span.s1 { color: #777777 } span.s2 { color: #0326cc }</style>
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } span.s1 { color: #000000 } span.s2 { color: #009193 } span.s3 { color: #4e9192 } span.s4 { color: #932192 }</style>
<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")
占位符${...}
SpEL表达式#{...},支持类型安全运输符 "?."
访问类作用域的方法和常量,需要依赖T关键字,比如#{T(System).currentTimeMillis()}
SpEL表达式还有很多知识点,不再赘述
使用@Value注解来调用${...}和#{...}
@Value("#{systemPrpperties[‘disc.title‘]}") String title
<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } span.s1 { color: #009193 } span.s2 { color: #4e9192 } span.s3 { color: #000000 } span.s4 { color: #932192 }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco; color: #3933ff } span.s1 { color: #777777 } span.s2 { color: #000000 }</style>
SpringInAction4笔记——装配