设为首页 加入收藏

TOP

Spring IOC官方文档学习笔记(十二)之基于Java的容器配置(一)
2023-07-25 21:42:36 】 浏览:82
Tags:Spring IOC 方文档 习笔记 十二 Java 容器配

1.@Bean与@Configuration

(1) 标注于类之上的@Configuration注解与标注于方法之上的@Bean注解是支持基于Java的容器配置的核心,被@Bean注解标注的方法用于实例化bean并将其注入至容器中,它与基于xml配置中的<bean/>标签起着相同的作用,@Bean可用在任何被@Component注解标注的类中,不过绝大部分情况下它们都被用于被@Configuration注解标注的类中;被@Configuration注解标注的类通常作为bean的定义源,如同基于xml配置中的<beans/>标签,此外,还可在@Configuration标注的类中配置bean之间的依赖关系,如下

//两个普通的类,其中ExampleB依赖ExampleA
public class ExampleA { }

public class ExampleB {

    private ExampleA exampleA;

    public ExampleB(ExampleA exampleA) {
        this.exampleA = exampleA;
    }
}

//配置类
@Configuration
public class Config {
    //注入bean ExampleA
    @Bean
    public ExampleA exampleA() {
        return new ExampleA();
    }

    //调用exampleA()方法来配置ExampleB
    @Bean
    public ExampleB exampleB() {
        return new ExampleB(exampleA());
    }

    //上下这两个exampleB方法等价,注意,在下面这个例子中,Spring会自动帮我们注入ExampleA对象
//    @Bean
//    public ExampleB exampleB(ExampleA exampleA) {
//        return new ExampleB(exampleA);
//    }
}

//启动容器,打印注入的对象是否相同
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
System.out.println(ctx.getBean(ExampleB.class).getExampleA() == ctx.getBean(ExampleA.class));

//观察结果,可见Spring执行了依赖注入,注入了容器中的ExampleA,而非new出来了一个新的ExampleA
true

(2) @Bean也可用在任何被@Component注解标注的类中,此时,我们称其为lite @Bean模式,而在这种lite模式下,我们不能配置bean之间的依赖关系,如下所示

//取上面的例子,其他保持不变,只将Config类上的@Configuration注解变更为@Component注解,此时其中的@Bean注解就处于lite @Bean模式
@Component
public class Config {

    //保持不变...
}

//启动容器,观察打印结果,为false,可见此时Spring并没有执行依赖注入,而是直接new出来了一个新的ExampleA给ExampleB,因此在这种lite模式下,我们不能配置bean之间的依赖关系

2.通过AnnotationConfigApplicationContext实例化Spring容器

(1) AnnotationConfigApplicationContext作为Spring的容器,它不仅可以接受@Configuration类(同时这个类本身也会被注册为一个bean)作为参数,还可以接受@Component类或用JSR-330注解标注的类作为参数,如下

//例一: 一个Spring配置类
@Configuration
public class Config {

}

public static void main(String[] args) {
    //使用@Configuration类作为输入,完全摆脱掉基于xml的配置  
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
    //打印,会观察到Config也被注入到了容器中
    Arrays.stream(ctx.getBeanDefinitionNames()).forEach(System.out::println);
}

//例二: ExampleB被JSR 330标准注解标注
@Component
public class ExampleA {

}

@Named
public class ExampleB {
    @Inject
    private ExampleA exampleA;

    public ExampleA getExampleA() {
        return exampleA;
    }
}

public static void main(String[] args) {
    //使用@Component类或用JSR-330注解标注的类作为参数,容器同时会对它们进行依赖注入
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ExampleA.class, ExampleB.class);
    System.out.println(ctx.getBean(ExampleB.class).getExampleA());
}

(2) 可以使用AnnotationConfigApplicationContext类的register(Class<?>…?)方法编程式的向容器中注册,如下

public class ExampleA { }

public static void main(String[] args) {
    //使用无参构造函数
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    //编程式的向容器中注册bean ExampleA
    ctx.register(ExampleA.class);
    //refresh()方法用于处理bean,一定要调用此方法,否则容器将抛出异常
    ctx.refresh();
    System.out.println(ctx.getBean(ExampleA.class));
}

(3) 我们可以使用@ComponentScan(basePackages = "...")注解或<context:component-scan base-package="..."/>标签来开启注解扫描,此外,AnnotationConfigApplicationContext也提供了scan(String…?)方法来开启注解扫描,如下

//ExampleA位于cn.example.spring.boke包下
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MQ收到无序的消息时如何进行业务.. 下一篇学习笔记——AOP-代理模式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目