Spring的两种配置方式——基于注解配置和基于JAVA配置

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对象,那么完全可以使用@Component、@Controller、@Service等注解注册bean,那么就需要配置@ComponentScan注解进行自动扫描。
那么基于JAVA的配置与基于注解的配置有什么区别呢?

图1

图2

图3

实验中碰到的问题1:直接使用@Autowired注解修饰“Action”来注入Action,Spring容器报错

报错

由于有多个类实现了Action接口,所以Spring不知道应该绑定哪个实现类,所以抛出了如上错误。
解决方法:
解决方法

使用Qualifier注解

实验中碰到的问题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

通过@Value注解
构造方法注入
Setter()注入

4、本章小结

Spring容器启动有三要素:Bean的定义,Bean的实现,Spring容器。
在基于XML的bean属性配置中,bean的定义信息与bean的实现类是分离的。

你可能感兴趣的:(Spring的两种配置方式——基于注解配置和基于JAVA配置)