给容器中注册组件的几种方式(二)

接上篇:

二:@Bean,导入第三方包里面的组件

  //@Bean  

//不指定value时,默认将方法名称当成ID,当指定value时,name就是其value;类型(class)就是返回值的类型,老版本的是name

     @Bean("myUser")

       public  User user() {
    
    

              return new
User("李四", "1234565");

       }

     

/*

    * @Scope 作用域:

    * singleton(单实例):默认的选项,IOC容器一启动就创建对象放在IOC容器中,以后每次都是在这个容器里面拿,只会创建一次

    * prototype(多实例):IOC容器启动时不会创建对象,每次获取的时候才会去调用方法创建对象放在IOC容器中,每次创建都是一个不同的对象值

    */

   /*

    * @Lazy 

懒加载

    * 单实例bean在容器启动时就创建对象,而懒加载可以使其启动时不加载,在使用(获取)这个bean时再创建对象(注意:单实例只会创建一次对象)

    */

   /*

    * @Conditional({Condition}):按照一定的条件进行判断,满足条件才给容器中注册这个bean

    * (spring4.0以后的版本才有)

    * Condition:条件:

    * 自定义条件:WindowsCondition.java,LinuxCondition.java

    * 因为它的目标为@Target({ElementType.TYPE,

ElementType.METHOD}),所有不仅能用在方法上,还能用在类上(类中组件统一设置):

    * 当用在类上时,表示满足该条件才会去注册这个类下面的bean

    */
    @Conditional({
    
    WindowsCondition.class})

       @Bean("bill")

       public User user01()
{
    
    

              return new
User("bill", "@Conditional");

       }

       @Conditional({
    
    LinuxCondition.class})

       @Bean("linus")

       public User user02()
{
    
    

              return new
User("linus", "@Conditional");

       }

       

       //使用

spring提供的FactoryBean工厂注册bean

    @Bean

       public myFactoryBean
factoryBean() {
    
    

              return new
myFactoryBean();

       }

      

自定义条件类(LinuxCondition.java,WindowsCondition.java),实现“Condition”接口,重写“matches”方法,使用它的参数可以获取到上下文环境,可以获取到当前运行环境,例如(Window10),例如:

   public class

WindowsCondition implements Condition {

    @Override

       public boolean
matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    
    

              // 1:获取当前IOC容器使用的bean工厂:

              ConfigurableListableBeanFactory
beanFactory = context.getBeanFactory();

              // 2:获取当前IOC容器的类加载器

              ClassLoader
classLoader = context.getClassLoader();

              // 3:获取当前运行环境

              Environment
environment = context.getEnvironment();

              // 4:获取bean定义的注册类(比如user.class)

              BeanDefinitionRegistry
registry = context.getRegistry();

              // 4:获取资源加载器

              ResourceLoader
resourceLoader = context.getResourceLoader();



              // 通过运行环境获取到当前的操作系统是不是Linux

              String
property = environment.getProperty("os.name");

              if
(property.contains("Windows")) {
    
    

                     return
true;

              }

              return false;

       }





} 



通过自定义条件可以达到强大的效果,自动装配底层大量的用到的自定义条件
另外再说一个eclipse切换环境的方式

/*

               * 切换激活环境的方式:

               *  0: //添加操作变量(使用命令行动态参数):右键Run AS,点击最后一个-->Arguments的VM arguments(虚拟机参数),输入:-Dos.name=linux

               * 1:使用命令行动态参数:上面有,不同的是输入的值:-Dspring.profiles.active=“测试环境的名称”(比如:test,Dev)

               * 2:使用代码的方式:

               *   2.1:创建一个空的容器:AnnotationConfigApplicationContext=new
AnnotationConfigApplicationContext();

               *   2.2:设置需要激活的环境:applicationContext.getEnvironment().setActiveProfiles("test","dev");

               *   2.3:注册主配置类:applicationContext.register(myProfileConfig.class);  register:注册

               *   2.4:启动刷新容器:applicationContext.refresh();

               * 

               */

本篇完。。

猜你喜欢

转载自blog.csdn.net/weixin_44543131/article/details/108617324
今日推荐