Spring(004)-Bean装配

一,问题,Bean找不到

代码

@Component
public class DemoClass {

    public int doSth() {
        return 1;
    }
}

测试代码

@RunWith(SpringJUnit4ClassRunner.class)
public class DemoClassTest {

    @Autowired
    private DemoClass demoClass;

    @Test
    public void doSth() {
        Assert.assertEquals(1, demoClass.doSth());
    }
}

虽然DemoClass打了@Component注解,但是在测试代码中@Autowired是找不到到,因为DemoClass是没有被Spring装配到容器中。

Spring把Bean装配到容器主要有以下几种方式

 

 

二、通过代码方式

@Configuration注解的方式

新建一个类,增加@Configuration注解

@Configuration
@ComponentScan(basePackages = "com.purespring.demo")
public class DemoConfiguration {

}

这里面还有一个@ComponentScan,这个注解告诉Spring要扫描的包,Spring会通过这个配置把这个包下面的组件全部装配到容器中。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DemoConfiguration.class)
public class DemoClassTest {

    @Autowired
    private DemoClass demoClass;

    @Test
    public void doSth() {
        Assert.assertEquals(1, demoClass.doSth());
    }
}

测试通过。

@Bean的方式

@Configuration
public class DemoConfiguration {
    @Bean
    public DemoClass demoClass() {
        return new DemoClass();
    }
}

上面代码里面已经移除了@ComponentScan的注解,Spring不会做自动扫描,

@Bean会告诉Spring这个方法会返回一个对象,该对象需要被注册成一个Spring Bean

三、通过XML配置

增加xml配置,命名为demoConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.purespring.demo"></context:component-scan>
</beans>

在测试代码中引入配置

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/demoConfig.xml")
public class DemoClassTest {

    @Autowired
    private DemoClass demoClass;

    @Test
    public void doSth() {
        Assert.assertEquals(1, demoClass.doSth());
    }
}

测试通过。

posted @ 2019-11-24 20:30  ibrake  阅读(133)  评论(0编辑  收藏  举报