Day01:Spring容器
1、基本装配
1.0 属性注入和构造器注入的差异
- 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿。
- 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)。
1.1
@Component注解:表明该类会作为组件类,spring为其创建bean,参数为id(也可使用@Named注解为bean设置ID)
@ComponentScan:默认不启用组件扫描,需要显示配置,默认扫描与配置类相同的包,参数为包的名称,
- 可以设置基础包:
@ComponentScan(basePackage={"soundsystem", "video"})
- 可以指定包中含的类或接口:
@ComponentScan(basePackageClassess={CDPlayer.class, DVDPlayer.class})
若使用xml启动组件扫描:<context:component-scan base-package="soundsystem" />
1.2
@Bean(destoryMethod="shutdown")
@Autowired:spring特有,可用@Inject替换,自动装配,可用在构造器或属性的Setter方法上,参数required=true时,没有匹配到bean会抛异常,
1.3 JavaConfig - 通过Java装配bean
- 给类添加
@Configuration
注解 - @Bean注解方法,创建所需实例,id与方法名一致,属性name可指定
- 装配有依赖的bean:
return new CDPlayer(sgtPeppers()); //sgtPeppers方法也被注解bean,需要在同一个配置类中
public CDPlayer cdPlyaer(CompactDisc compactDisc) //自动装配CompactDisc到方法中,降低关联
1.4 XML装配bean
- 创建xml文件,并以
<beans>
为根 <bean id='名字' class='类的全名' />
-
<constructor-arg ref="引用的bean的id">
或者 c-命名空间模式xmlns:c="http://www.springframework.org/schema/c" bean id="cdPlayer" class="" c:cd-ref="引用id" />
- 使用
<constructor-arg>
元素进行构造器参数的注入 || 使用c:_title或者c:_0进行参数的注入
1.5 属性设置
对强依赖使用构造器注入
对可选性依赖使用属性注入
spring的p-命名空间替代<property>元素:xmlns:p="https://www.springframework.org/schema/p" p:compactDisc-ref="compactDisc //装配compactDisc属性
c-命名空间和p-命名空间:-ref后缀是装配bean,没有装配的就是字面量,不能使用p-空间装配集合,
1.6 组合配置
拆分config
- @Import导入config
- 创建更高级别的config,然后组合
@Import({a.class, b.class})
- javaconfig加载xml
@ImportResource("classpath:xx-config.xml")
- xml中引用javaconfig
<bean class="xx.config /> //使用xml配置 <bean id="player" class="com.player" c:cd-ref="comDisc" /> //使用java描述
2、高级装配
2.1 profile(环境)
- profile决定哪个bean创建和不创建,没指定profile则始终都被创建
- 给bean或方法配置@Profile("***")注解 || 在xml的头添加
profile="***"
- 需要配置激活哪个profile(dispatcherservlet的初始化参数、web应用的上下文参数、JNDI条目、环境变量、JVM系统属性、集成测试时用@ActiveProfiles注解)
- 配置:
spring.profiles.active || spring.profiles.active
3、条件化bean
@Conditional(MagicExistsCondition.class) //条件创建bean public class MagicExistsCondition implements Condition { public boolean matches { return true/false; } }
ConditionContext接口:
- 检查bean的定义(getRegistry())
- 检查bean是否存在(getBeanFactory())
- 检查环境变量(getEnvironment())
- 检查资源(getResourceLoader())
- 检查类是否存在(getClassLoader())
AnnotatedTypeMetadate接口:检查带有@Bean注解的方法上还有什么其他的注解(isAnnotated())
3.1.1 自动装配有歧义时
- 标示首选bean:@Component @Primary || @Bean @Primary || xml中primary="true"
- 限定自动装配:@Qualifier("限定符_bean_id");
- 可以给bean设置限定符:@Qualifier("***")
3.2 bean的作用域
在bean的类上使用@Scope注解,参数为ConfigurableBeanFactory.SCOPE_XXXXX
默认所有的bean:单例(singleton)模式
- 单例singleton:整个应用一个bean实例
- 原型prototype:每次注入或者通过spring上下文获取的时候都创建新实例
- 会话session:每个会话
- 请求request:每个请求