Spring:IoC 用法(九、@Bean 用法)

Java 配置详解

1、@Configuration

作用:一个 Java 配置类,同等于一个 XML 文件,容器级别配置

用法:

@Configuration
public class Config {

}

2、@Description

作用:描述配置文件的作用

用法:

@Configuration
@Description("描述作用:当前这个Java配置无作用,不能重复出现")
public class Config {

}

3、@Import

作用:引入另一个 Java 配置类,Java 配置之间相互引用

用法:

@Configuration
@Import(ControllerConfig.class)
public class Config {

}

4、@ImportResource

作用: 引入一个XML 配置文件,Java 配置与 XML 混合引用

用法:

@Configuration
@ImportResource("classpath:spring/RepositoryConfig.xml")
public class Config {

}


5、@Bean

作用:注册一个 Bean,对应一个 class 类

特点:1)、默认 id 属性值:方法名,id 其实也属于别名

          2)、别名 name 属性:指定别名后,默认 id 失效

          3)、注入方式 autowire 属性

                  Autowire.NO(默认)

                  Autowire.BY_TYPE

                  Autowire.By_NAME

          4)、初始化方法 initMethod

          5)、销毁方法 destoryMethod

测试:

测试(默认 id 值:id)

定义Controller

public class TestController {

    public void testController(){
        System.out.println("SUCCESS!!!");
    }
}

Java配置类

@Configuration
public class Config {

    @Bean
    public TestController testController123(){
        return new TestController();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    /**
     * 类型注入
     */
    @Autowired
    private TestController c1;

    /**
     * 别名注入
     */
    @Autowired
    @Qualifier("testController123")
    private TestController c2;

    @org.junit.Test
    public void testXMLConfig() {
        c1.testController();
        c2.testController();
    }
}

结果

SUCCESS!!!
SUCCESS!!!

测试(指定别名 name)

定义Controller

public class TestController {

    public void testController(){
        System.out.println("SUCCESS!!!");
    }
}

Java配置类

@Configuration
public class Config {

    @Bean(name = {"c1","c2"})
    public TestController testController123(){
        return new TestController();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    @Qualifier("c1")
    private TestController c1;

    @Autowired
    @Qualifier("c2")
    private TestController c2;

    @org.junit.Test
    public void testXMLConfig() {
        c1.testController();
        c2.testController();
    }
}

结果

SUCCESS!!!
SUCCESS!!!

测试(注入方式:autowire=no)

定义 Controller 控制层

public class TestController {

    private TestService testService;

    public TestController(TestService testService) {
        this.testService = testService;
    }

    public void testController() {
        System.out.println(testService.testService());
    }
}

定义 Service 接口

public interface TestService {

    String testService();
}

定义Service 接口实现

public class TestServiceImpl implements TestService {

    public String testService() {
        return "This is TestServiceImpl";
    }
}

Java配置类

@Configuration
public class Config {

    @Bean(autowire = Autowire.NO)
    public TestController testController123() {
        // 得到注入对象
        TestService testService = testService();
        // 使用构造方法注入
        return new TestController(testService);
    }

    @Bean
    public TestService testService() {
        return new TestServiceImpl();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

This is TestServiceImpl

测试(注入方式:autowire=by_name)

定义 Controller 控制层

public class TestController {

    private TestService testService;

    public void testController() {
        System.out.println(testService.testService());
    }

    // By_Name 时, 使用反射赋值,Set 方法必须有
    public void setTestService(TestService testService) {
        this.testService = testService;
    }
}

定义 Service 接口

public interface TestService {

    String testService();
}


定义Service 接口实现

public class TestServiceImpl implements TestService {

    public String testService() {
        return "This is TestServiceImpl";
    }
}

Java配置类

@Configuration
public class Config {

    @Bean(autowire = Autowire.BY_NAME)
    public TestController testController123() {
        return new TestController();
    }
    
    @Bean
    public TestService testService() {
        return new TestServiceImpl();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

This is TestServiceImpl

测试(注入方式:autowire=by_type)

定义 Controller 控制层

<同 autowire = byName>

定义 Service 接口

<同 autowire = byName>

定义Service 接口实现

<同 autowire = byName>

Java配置类

@Configuration
public class Config {

    @Bean(autowire = Autowire.BY_TYPE)
    public TestController testController123() {
        return new TestController();
    }

    @Bean
    public TestService testService() {
        return new TestServiceImpl();
    }
}


测试类

<同 autowire = byName>

结果

<同  autowire = byName >


测试(初始化 initMethod 方法、销毁 destroy 方法)

定义 Controller 

public class TestController {

    public void testController() {
        System.out.println("\nSUCCESS!!!");
    }

    // 初始化方法
    public void init() {
        System.out.println("this is TestServiceImpl init");
    }

    // 销毁方法
    public void destroy() {
        System.out.println("this is TestServiceImpl destroy");
    }
}

Java 配置文件

@Configuration
public class Config {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public TestController testController123() {
        return new TestController();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

this is TestServiceImpl init
SUCCESS!!!
this is TestServiceImpl destroy


6、@Profile

作用:不同环境下注册不同的 Bean

          1)、用于 @Configuration 级别上使用

          2)、用于 @Bean 级别上使用

测试:

@Configuration级别测试

定义Controller控制层

public class TestController {

    @Autowired
    private TestService testService;

    public void testController() {
        System.out.println(testService.testService());
    }
}

定义Service接口

public interface TestService {

    String testService();
}

定义Service接口实现

public class ProServiceImpl implements TestService {

    public String testService() {
        return "this is ProServiceImpl";
    }
}

public class TestServiceImpl implements TestService {

    public String testService() {
        return "This is TestServiceImpl";
    }
}

Java 配置文件

@Configuration
@Import({TestConfig.class, ProConfig.class})
public class Config {

    @Bean
    public TestController testController123() {
        return new TestController();
    }
}

@Configuration
public class ProConfig {

    @Bean
    @Profile("pro")
    public TestService testService() {
        return new ProServiceImpl();
    }
}

@Configuration
public class TestConfig {

    @Bean
    @Profile("test")
    public TestService testService(){
        return new TestServiceImpl();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
@ActiveProfiles("pro") // 激活属性文件
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

this is ProServiceImpl

@Bean级别测试

定义Controller控制层

public class TestController {

    @Autowired
    private TestService testService;

    public void testController() {
        System.out.println(testService.testService());
    }
}

定义Service接口

public interface TestService {

    String testService();
}

定义Service接口实现

public class ProServiceImpl implements TestService {

    public String testService() {
        return "this is ProServiceImpl";
    }
}

public class TestServiceImpl implements TestService {

    public String testService() {
        return "This is TestServiceImpl";
    }
}

Java 配置文件

@Configuration
public class Config {

    @Bean
    public TestController testController123() {
        return new TestController();
    }

    @Bean
    @Profile("test")
    public TestService testService(){
        return new TestServiceImpl();
    }

    @Bean
    @Profile("pro")
    public TestService proService() {
        return new ProServiceImpl();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
@ActiveProfiles("pro") // 激活属性文件
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

this is ProServiceImpl


7、@Lazy

作用:延迟加载(默认 true)

          1)、用于 @Configuration 级别上使用

          2)、用于 @Bean 级别上使用

用法:

// Configuration 级别的延迟加载
@Configuration
@Lazy(value = false)
public class Config {

    // Bean 级别的延迟加载(就近原则,Bean的优先级大于 Configuration)
    @Bean
    @Lazy(true)
    public TestController testController123() {
        return new TestController();
    }
}

测试:无(通过启动时间或启动日志的方式判断)

8、@Scope

作用:注册 Bean 的使用范围(作用域)

          1)、单例

          2)、原型(多例)

测试:

单例测试:

定义Controller

public class TestController {

    private int i;

    public void testController() {
        System.out.println(i++ + " SUCCESS!!!");
    }
}

Java配置类

@Configuration
public class Config {

    // 单例
    @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
    public TestController testController123() {
        return new TestController();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController c1;

    @Autowired
    private TestController c2;

    @org.junit.Test
    public void testXMLConfig() {
        c1.testController();
        c2.testController();
        if(c1 == c2){
            System.out.println("单例模式实例相等。");
        }else {
            System.out.println("原型模式实例不相等。");
        }
    }
}

结果

0 SUCCESS!!!
1 SUCCESS!!!
单例模式实例相等。

原型测试:

定义Controller

<同单例不变>

Java配置类

@Configuration
public class Config {

    // 多例
    @Bean
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public TestController testController123() {
        return new TestController();
    }
}


测试类

<同单例不变>

结果

0 SUCCESS!!!
0 SUCCESS!!!
原型模式实例不相等。


9、@DependsOn

作用:实例 Bean 之前,先实例另一个 Bean

测试:(不要在意类的名字)

定义Controller控制层

public class TestController {

    public String testController() {
        return TestServiceImpl.getValue();
    }
}

定义初始化数据

public class TestServiceImpl {

    private static String value = "初始化数据!!!";

    public static void setValue(String value) {
        TestServiceImpl.value = value;
    }

    public static String getValue() {
        return value;
    }
}

定义覆盖数据

public class InitClass {

    public InitClass() {
        TestServiceImpl.setValue("覆盖初始化数据!!!");
    }
}

Java配置文件

@Configuration
public class Config {

    @Bean
    @DependsOn("init")
    public TestController testController123() {
        return new TestController();
    }

    // 使用延迟加载增强显示结果
    @Bean(name = "init")
    @Lazy
    public InitClass initClass() {
        return new InitClass();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController c1;

    @org.junit.Test
    public void testXMLConfig() {
        String data = c1.testController();
        System.out.println(data);
    }
}

结果

覆盖初始化数据!!!

11、@ Autowired

作用:类型注入方式,如果类型冲突,需要结合@Qualifier(消除get、set方法)

测试:略


12、@Qualifier

作用:别名方式注入,需要集合@Autowrited使用(消除get、set方法)

测试:略


10、@Primary

作用: 当注入发生冲突或者分歧的时候,优先注入原则

测试:

定义 Controller 控制层

public class TestController {

    @Autowired
    private TestService testService;

    public void testController() {
        System.out.println(testService.testService());
    }
}

定义 Service 服务层接口

public interface TestService {

    String testService();
}

定义 Service 服务层接口实现

public class TestServiceImpl implements TestService {

    public String testService() {
        return "This is TestServiceImpl";
    }
}

public class ProServiceImpl implements TestService {

    public String testService() {
        return "This is ProServiceImpl";
    }
}

Java配置文件

@Configuration
public class Config {

    /**
     * 控制层
     */
    @Bean
    public TestController testController() {
        return new TestController();
    }

    /**
     * 服务层:注入两个实现
     */
    @Bean
    public TestService testService() {
        return new TestServiceImpl();
    }

    @Bean
    @Primary // 优先使用
    public TestService proService() {
        return new ProServiceImpl();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Autowired
    private TestController controller;

    @org.junit.Test
    public void testXMLConfig() {
        controller.testController();
    }
}

结果

This is ProServiceImpl

13、@Resource

作用:命名资源依赖注入,别名优先注入,类型其次(消除get、set方法)

测试:

定义Controller

public class TestController {

    public void testController() {
        System.out.println("SUCCESS!!!");
    }
}

Java配置文件

@Configuration
public class Config {

    @Bean
    public TestController c1() {
        return new TestController();
    }
}

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class Test {

    @Resource
    private TestController c1;

    @Resource
    private TestController c2;

    @org.junit.Test
    public void testXMLConfig() {
        c1.testController();
        c2.testController();
    }
}

结果

SUCCESS!!!
SUCCESS!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值