潍坊Java培训
达内潍坊中心

18300268127

热门课程

Java配置类装配bean

  • 时间:2018-02-24 13:51
  • 发布:潍坊电脑编程培训
  • 来源:互联网

    自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案,那就是通过显示的装配机制--Java配置和XML配置的方式来实现bean的装配。
    Java配置类装配bean
    Car接口中有开车的drive方法,该接口有两个实现--QQCar和BenzCar
    package spring.impl;
    import spring.facade.Car;
    public class QQCar implements Car {
    @Override
    public void drive() {
    System.out.println(“开QQ车”);
    }
    }
    既然是通过Java代码来装配bean,那就是不是我们上一篇讲的通过组件扫描的方式来发现应用程序中的bean的自动装配机制了,而是需要我们自己通过配置类来声明我们的bean.我们先通过@Configuration注解来创建一个Spring的配置类,该类中包含了bean的创建细节--
    import org.springframework.context.annotation.Configuration;
    import spring.facade.Car;
    import spring.impl.QQCar;
    /**
    * @Configuration 表明该类是Spring的一个配置类,该类中会包含应用上下文创建bean的具体细节
    * @Bean 告诉Spring该方法会返回一个要注册成为应用上下文中的bean的对象
    */
    @Configuration
    public class CarConfig {
    @Bean
    public Car laoSiJi() {
    return new QQCar();
    }
    }
    以上类中创建的bean实例默认情况下和方法名是一样的,我们也可以通过@Bean注解的name属性自定义ID,例如 @Bean(name = “chenbenbuyi”) ,那么在获取bean的时候根据你自己定义的ID获取即可。接着我们测试--
    package spring.test;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import spring.config.CarConfig;
    import spring.facade.Car;
    public class CarTest {
    @Test
    public void carTest() {
    ApplicationContext context = new AnnotationConfigApplicationContext(CarConfig.class);
    //根据ID从容器容获取bean
    Car car = (Car) context.getBean(“chenbenbuyi”);
    car.drive();
    }
    }
    以上测试能够成功输出,这就表明我们能够获取到QQCar的实例对象的,而这也是最简单的基于Java配置类来装配bean的示例了。但是你可能会说,明明是我们自己创建的Car的实例,怎么就成了Spring为我们创建的呢?好吧,我们把@Bean注解拿开,测试当然是无法通过,会抛NoSuchBeanDefinitionException异常。这里,你可能需要好好理解控制反转的思想了:因为现在对于bean创建的控制权我们是交给了Spring容器的,如果没有@Bean注解,方法就只是一个普通方法,方法体返回的实例对象就不会注册到应用上下文(容器)中,也就说,Spring不会为我们管理该方法返回的实例对象,当我们在测试类中向容器伸手要对象的时候,自然就找不到。

    上述示例过于简单,现在,我们要更进一步,给简单的对象添加依赖,来完成稍微复杂一点的业务逻辑。车是需要老司机来开的,于是我们同上篇一样定义一个Man类,Man的工作就是开车--

潍坊达内

    package spring.impl;
    import spring.facade.Car;
    public class Man {
    private Car car;public Man(Car car) {
    this.car = car;
    }
    public void work() {
    car.drive();
    }
    }
    Car的对象实例是通过构造器注入,而Car的实例对象在配置类中通过方法laoSiJi()返回,所以我们在配置类中可以直接调用laoSiJi方法获取bean注入到Man的实例对象--
    package spring.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import spring.facade.Car;
    import spring.impl.BenzCar;
    import spring.impl.Man;
    @Configuration
    public class CarConfig {
    @Bean
    public Car laoSiJi() {
    return new BenzCar();
    }
    @Bean
    public Man work() {
    return new Man(laoSiJi());
    }
    }
    测试类中通过上下文对象的getBean(“work”)方法就可以获取到Man的实例对象,从而完成对老司机开车的测试。或许,你会觉得,work方法是通过调用laoSiJi方法才获取的Car的实例的,实际上并非如此。因为有了@Bean注解,Spring会拦截所有对该注解方法的调用,直接返回该方法创建的bean,也即容器中的管理的bean.也就是说,laoSiJi方法返回的bean交给了Spring容器管理后,当其他地方需要实例对象的时候,是直接从容器中获取的第一次调用方法产生的实例对象,而不会重复的调用laoSiJi方法。我们可以如下测试--
    package spring.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import spring.facade.Car;
    import spring.impl.BenzCar;
    import spring.impl.Man;
    @Configuration
    public class CarConfig {
    @Bean
    public Car laoSiJi() {
    System.out.println(“方法调用”);
    return new BenzCar();
    }
    @Bean
    public Man work() {
    return new Man(laoSiJi());
    }
    @Bean
    public Man work2() {
    return new Man(laoSiJi());
    }
    }
    如上测试你会发现,虽然我定义了两个方法来获取Man实例,但是控制台只输出了一次调用打印,即证明方法只在最初返回bean的时候被调用了一次,而后的实例获取都是直接从容器中获取的。这也就是默认情况下Spring返回的实例都是单例的原因:一旦容器中注册了实例对象,应用程序需要的时候,就直接给予,不用重复创建。当然,很多情况下我们不会如上面的方式去引入依赖的bean,而可能会通过参数注入的方式,这样你就可以很灵活的使用不同的装配机制来满足对象之间的依赖关系,比如下面这种自动装配的方式给Man的实例注入依赖的Car对象--
    package spring.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import spring.facade.Car;
    import spring.impl.Man;
    @Configuration
    @ComponentScan(“spring.impl”)
    public class CarConfig {
    @Bean
    public Man work(Car car) {
    return new Man(car);
    }
    }

    当然,如果你喜欢去简就繁,也可以通过XML配置文件配置依赖的bean.

更多潍坊达内相关资讯,请扫描下方二维码

潍坊达内

上一篇:Servlet和JSP之自定义标签学习
下一篇:WebSocket介绍

马上预约七天免费体验课

姓名:

电话:

C语言与C++的差异性

达内童程童美战略收购好小子,加码青少儿编程市场

java语言从入门到精通有什么学习技巧?怎么学最快?

jdk安装步骤详解

选择城市和中心
贵州省

广西省