文章目录
- 基于xml的装配方式
- 基于注解的装配方式
JavaConfig 的装配方式,也属于注解。
之前的简单注解,是没法启动的,必须借助于xml 启动扫描和自动装配
有了JavaConfig 之后,可以通过JavaConfig启动 扫描和自动装配
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@Configuration
@ComponentScan
@ComponentScan("com.zzl")
@ComponentScan(basePackages={"com.zzl.autowired","com.zzl.service"})
@ComponentScan(basePackageClasses={Service.class,SgtPeppers.class})
@Bean
@Component
@Component("loveHeartsClub")
<context:annotation-config/> // 启动自动装配,不管是 注解生成的bean,还是xml生成的bean。会经过 Autowired 装配到对象上去
<context:component-scan base-package=""></context:component-scan> // 包含<context:annotation-config/>的功能,并且还会自动扫描生成bean
// 生成bean,和装配bean,是两回事,上面那个只负责装配容器中的 bean,至于容器中的bean怎么来的,它并不管
// 下面这个不仅能生成bean,还可以 利用注解,装配bean
@Autowired() // 默认required=ture
@Autowired(required=false) // 可以加在属性上、构造器上、set方法上、普通方法上 为入参装配bean
@Inject // 相当于 @Autowired(required=false)
@Qualifier("dance") // 指定用哪一个bean装配
Spring 注意事项
- Spring 3点几的版本 AOP自动注解不支持 jdk1.8
- xml中配置的bean ,属性必须配置pulic的set方法
Spring 容器启动
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext context = new AnnotationConfigApplicationContext(ConcertConfig.class);
一、
二、
Spring 配置的可选方案
在XML中进行显示配置
创建XML配置规范
声明一个简单的bean
javaConfig与XML配置对比
- JavaConfig 是通过方法,返回对象,然后将的对象加入到spring bean容器中,进行统一管理,创建方式更容易让人接受,使用更简单,功能更强大,比如创建时加入一些判断,数据处理等。
- 没法统一重命名
借助构造器注入 初始化bean
- 元素
- 使用spring3.0 所引入的c-命名空间
- 注入bean
- 注入字面量
- 装配集合 (c-命名空间无法处理的问题)
-
装配null
-
装配list 集合
-
装配set集合
构造器注入 还是属性注入,与组合和聚合对应,必含的属性用组合,采用构造器注入
-
通过属性初始化bean
1、<property name="" ref=""/>
<property name="" value=""/>
2、<p:pName-ref=""/>
<p:pName=""/>
- 注入bean
- 注入字面量
-
3 util- 命名空间
隐式的bean发现机制和自动装配
spring容器默认禁用注解装配,可以在xml中配置启动它 <context:annotation-config> —这个只是支持自动装配,但并不会扫描生成bean
<context: component-scan > xml中配置这个,不仅包含上面的自动装配功能,还会启动spring的自动检测bean和定义bean
组件扫描:
- 启动扫描
- 在xml中配置<context:component-scan base-package=”com.zzl”> 元素,配置扫描地址。
- @ComponentScan 默认会扫描与配置类同包及子包
- @ComponentScan(“com.zzl”)//扫描一个包
- @ComponentScan(basePackages={“com.zzl.autowired”,“com.zzl.service”})//扫描多个包
- @ComponentScan(basePackageClasses={Service.class,SgtPeppers.class})//扫描多个类及其同包和子包
- 声明创建bean
- @Component 声明为组件,默认生成类名首字母小写的 实例
a) @Component(“bootStartTest”) //生成指定变量名的实例。 - @Configuration 声明为java配置文件
- @Controller – 标识该类定义未Spring MVC controller
- @Service ---- 标识该类定义为服务类 --service层
- @Repository —标识该类定义为数据仓库 --dao层
自动装配 @Autowired
使用的是byType的自动装配,如果一个接口类有多个实现类,也可以只不过不会装配
- @Autowired
- 可以注解成员变量
- 可以注解在构造器的入参上面。
- 可以注解在set方法上面做入参。
- 普通入参方法上面
- @Autowired(required=false) – 此时需要谨慎对待,如何使用的时候未做null检测,会出现NullPointerException
@Autowired
@Qualifier("song")//指定注解 名称为song的bean
public ITalent talent;
- @Inject 没有required属性
默认自动装配
- 默认情况 xml中的beans 的 default-autwire 被设置未none----每一个文件都可以有一个default-autwire,不同的文件可以有不同的装配方式,不同的bean也可以指定不同的装配方式。bean上的装配方式可以对beans中的进行覆盖
在Java中进行显示配置
javaConfig装配
-
@Configuration 注解java类,表明这个类是配置类
-
@Bean 注解 带对象返回值的方法。 返回的对象,会被spring 加入到 bean容器中。
-
@Bean(name=”lovely”) 指定对象的名称。
这种方式可以更*的控制生成bean的
导入和混合配置
在JavaConfig中引用XML配置
- 单个JavaConfig 里面的内容非常多,引入多个JavaConfig
- JavaConfig引入 xml
在XML配置中引用 JavaConfig
- 在xml中引入xml
- 在xml中引入JavaConfig
- 在xml中引入 xml和JavaConfig
Spring 高级技术
XML的bean 配置的继承
bean的继承,抽象bean, 做为 创建bean的模板
bean 的依赖关系
bean的作用域
使用bean的 scope属性来配置bean的作用域
- singleton:默认值,容器初始化时创建bean实例,在整改容器的声明周期只创建一个bean,相当于单例
- prototype:原型的,容器初始化不创建bean实例,而每次请求时都创建一个新的bean实例。
Spring 特殊点
- 引入了自动扫描之后,添加了spring-context。
spring-context 启动了 Cglib代理, 不存在抽象bean。所以一图可以用 abstract,而二图不行。