spring注解开发-03

@Autowired、@Resource、@Inject

@Autowired

	 @Autowired默认是按照类型装配,当要调用的接口存在多个实现类时,
     * 1、要注入容器的名称与注册到IOC的容器名称保持一致;
     * 2、使用@Qualifier("...")指定需要导入的容器
     * 3、使用@Primary注解把容器当中的接口实现指定为主要的

@Resource和@Inject

 /**
     * @Resource: 默认按照属性名称去IOC容器进行查找对应的bean组件,也可以指定name属性,找到属性值对应的bean,
     *              没有@Primary也没有require=false
     * @Inject:
     *   首先需要引入inject的坐标,默认按照属性名称去查找对应的bean组件,可以使用@Primary,不可以在@Inject注解上
     *   指定任何的属性。
     * @Resource和@Inject的共同点:都是java的,而@Autowired是spring的
     */
  • @Inject导入的包是:

      		<dependency>
      			<groupId>javax.inject</groupId>
      			<artifactId>javax.inject</artifactId>
      			<version>1</version>
      		</dependency>
    

@Autowired不仅能做属性注入、还可以做方法注入、构造器注入、参数注入等

  • Car Bean:

      @Component
      public class Car {
      
          /**
           * 颜色
           */
          private String color;
      
          public String getColor() {
              return color;
          }
      
          public void setColor(String color) {
              this.color = color;
          }
      
          public Car() {
          }
      
          public Car(String color) {
              this.color = color;
          }
      }
    

属性注入:在属性上添加@Autowired注解,自动会去IOC容器中去查找对应的bean组件

@Component
public class Boss {

	@Autowired
    private Car car;

    @Override
    public String toString() {
        return "Boss{" +
                "car=" + car +
                '}';
    }
}

方法注入:在方法上添加@Autowired注解,自动会去IOC容器中去查找对应的bean组件

@Component
public class Boss {


    private Car car;

    public Car getCar() {
        return car;
    }

	@Autowired
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Boss{" +
                "car=" + car +
                '}';
    }
}

构造方法注入:在构造方法上添加注解,自动会去IOC容器中去查找对应的bean组件,如果一个对象中有且只有一个有参构造,注解可省略

@Component
public class Boss {


    private Car car;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

	@Autowired
    public Boss( Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Boss{" +
                "car=" + car +
                '}';
    }
}

参数注入:在参数上添加@Autowired注解,自动会去IOC容器中去查找对应的bean组件,如果一个对象中有且只有一个有参构造,注解可省略

@Component
	public class Boss {
	
	
	    private Car car;
	
	    public Car getCar() {
	        return car;
	    }
	
	    public void setCar(Car car) {
	        this.car = car;
	    }
	
		
	    public Boss( @Autowired Car car) {
	        this.car = car;
	    }
	
	    @Override
	    public String toString() {
	        return "Boss{" +
	                "car=" + car +
	                '}';
	    }
	}

Aware源码

 /* 
 		1、首先执行的是前置拦截器postProcessBeforeInitialization(),判断bean是不是属于这些具体的Aware实现类:
         * if (System.getSecurityManager() != null &&
         * 				(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
         * 						bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
         * 						bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
         * 			acc = this.applicationContext.getBeanFactory().getAccessControlContext();
         *                }
         *  2、如果access不为空,那么判断对应的权限
         *  if (acc != null) {
         * 			AccessController.doPrivileged(new PrivilegedAction<Object>() {
         *                                @Override
         * 				public Object run() {
         * 					invokeAwareInterfaces(bean);
         * 					return null;
         * 				}
         * 			}, acc);
         * 		}
         *  3、对属性进行实例化并进行赋值
         *  private void invokeAwareInterfaces(Object bean) {
         * 		if (bean instanceof Aware) {
         * 			if (bean instanceof EnvironmentAware) {
         * 				((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
         * 			}
         * 			if (bean instanceof EmbeddedValueResolverAware) {
         * 				((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
         * 			}
         * 			if (bean instanceof ResourceLoaderAware) {
         * 				((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
         * 			}
         * 			if (bean instanceof ApplicationEventPublisherAware) {
         * 				((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
         * 			}
         * 			if (bean instanceof MessageSourceAware) {
         * 				((MessageSourceAware) bean).setMessageSource(this.applicationContext);
         * 			}
         * 			if (bean instanceof ApplicationContextAware) {
         * 				((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
         * 			}
         * 		}
         * 	}
         *
         */

Profile多环境

  • 导包

      <dependency>
      			<groupId>com.mchange</groupId>
      			<artifactId>c3p0</artifactId>
      			<version>0.9.5.1</version>
      		</dependency>
      
      		<dependency>
      			<groupId>mysql</groupId>
      			<artifactId>mysql-connector-java</artifactId>
      			<version>5.1.32</version>
      		</dependency>
    
  • 准备一个Configration类:

      @Configuration
      public class ConfigrationByProfiles {
      
          @Profile("dev")
          @Bean
          public DataSource dataSourceByDev(){
              DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
              driverManagerDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tensquare_user?characterEncoding=utf-8");
              driverManagerDataSource.setDriverClass("com.mysql.jdbc,Driver");
              driverManagerDataSource.setUser("root");
              driverManagerDataSource.setPassword("root");
              return driverManagerDataSource;
          }
      
          @Profile("test")
          @Bean
          public DataSource dataSourceByTest(){
              DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
              driverManagerDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tensquare_qa?characterEncoding=utf-8");
              driverManagerDataSource.setDriverClass("com.mysql.jdbc,Driver");
              driverManagerDataSource.setUser("root");
              driverManagerDataSource.setPassword("root");
              return driverManagerDataSource;
          }
      
          @Profile("prod")
          @Bean
          public DataSource dataSourceByProd(){
              DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
              driverManagerDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tensquare_gathering?characterEncoding=utf-8");
              driverManagerDataSource.setDriverClass("com.mysql.jdbc,Driver");
              driverManagerDataSource.setUser("root");
              driverManagerDataSource.setPassword("root");
              return driverManagerDataSource;
          }
      
      }
    

1、改变JVM的运行环境

  • 设置JVM的参数:

      -Dspring.profiles.active=dev
    

2、设置使用环境的状态

		/**
		this();//初始化
		register(annotatedClasses);//注册配置
		refresh();//刷新context
		*/
		//获取一个配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        //初始化一个环境变量
        ConfigurableEnvironment configurableEnvironment = new StandardEnvironment();
        //设置默认执行的环境
        configurableEnvironment.setDefaultProfiles("dev");
        //设置需要执行的环境
        configurableEnvironment.setActiveProfiles("dev");
        //将环境进行重新设置
        context.setEnvironment(configurableEnvironment);
        //将配置类进行注册
        context.register(ConfigrationByProfiles.class);
        //context刷新
        context.refresh();
        //获取环境标识并设置对应的环境
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for(String beanDefinitionName : beanDefinitionNames){
            System.out.println(beanDefinitionName);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值