Spring的两种配置方式
1、基于注解的配置
配置类DoConfig
@Configuration
@ComponentScan("com.example")
public class DoAnnoConfig {
}
测试代码
@Test
public void test() {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(DoAnnoConfig.class);
LowerAction lowerAction=ctx.getBean(LowerAction.class);
lowerAction.execute("Rod Johnson");
}
测试结果实验中想到的问题1:@ComponentScan的作用是什么?
@ComponentScan扫描包名下的所有类,把有注解声明的类加载到Spring容器中。
packages下用注解标识的类,由spring自动扫描并且装入bean容器。
实验中想到的问题2:既然@ComponentScan可以扫描包下的类并装入Bean容器,那么配置类上一定需要@Configuration注解吗?
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法。
Spring提供了一个AnnotationConfigApplicanContext类,能够直接通过标注@Configuration的Java类启动Spring容器。
测试代码
@Test
public void test1(){
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(DoAnnoConfig.class);
}
测试结果
由实验结果可见,Spring容器已启动。@Configuration作用为配置spring容器。因此必不可缺。
2、基于JAVA的配置
配置类DoJavaConfig
@Configuration
public class DoJavaConfig {
@Bean(name = "UpperAction")
public UpperAction upperAction(){
return new UpperAction();
}
}
测试代码
@Test
public void test() {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(DoJavaConfig.class);
UpperAction upperAction=ctx.getBean(UpperAction.class);
upperAction.execute("hahahaha");
}
想到的问题1
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的<bean>。作用为注册bean对象。
既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service等注解注册bean,那么就需要配置@ComponentScan注解进行自动扫描。
那么基于JAVA的配置与基于注解的配置有什么区别呢?
实验中碰到的问题1:直接使用@Autowired注解修饰“Action”来注入Action,Spring容器报错
由于有多个类实现了Action接口,所以Spring不知道应该绑定哪个实现类,所以抛出了如上错误。
解决方法:
实验中碰到的问题1:使用@Service注解修饰LowerAction和UpperAction,对于基于“Java配置”的方式是否是必须的?
不是必须的。@Service可以将一个类定义成一个bean,实例化并放入容器。而配置类中的@Bean把实例化的对象转化成一个Bean,放在IoC容器中。
3、结合前一章的两种注入方法输出hello
在之前的实验中
测试代码形式如下:
@Test
public void test() {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(DoAnnoConfig.class);
LowerAction lowerAction=ctx.getBean(LowerAction.class);
lowerAction.execute("Rod Johnson");
}
因为LowerAction的成员message均没有值,测试结果均如下:因此可以通过以下方法输出hello
4、本章小结
Spring容器启动有三要素:Bean的定义,Bean的实现,Spring容器。
在基于XML的bean属性配置中,bean的定义信息与bean的实现类是分离的。