本文共 6758 字,大约阅读时间需要 22 分钟。
@Autowired:(Spring规范支持的注解)
applicationContext.getBean(BookDao.class)
找到就赋值(applicationContext.getBean("bookDao"))
@Qualifier("bookDao")
:使用@Qualifier
指定需要装配的组件的id,而不是使用属性名@Autowired(required=false)
@Primary
:让Spring进行自动装配的时候,默认使用首选的bean;也可以继续使用@Qualifier
指定需要装配的bean的名字,@Qualifier
优先级高于@Primary
@Resource(JSR250)和@Inject(JSR330)[java规范的注解]
javax.inject
的包,和Autowired的功能一样。没有required=false
的功能;@Autowired:Spring定义的;
@Resource、@Inject都是java规范;UserDao
@Repository@Getter@Setter@ToStringpublic class UserDao { private String lable = "1";}
UserService
import lombok.ToString;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service@ToStringpublic class UserService { @Qualifier("userDao") @Autowired(required = false) private UserDao userDao; @Resource private UserDao userDao;}
Spring配置文件Config.java
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;@Configuration@ComponentScan("com.example.demo")public class Config { @Primary @Bean("userDao2") public UserDao userDao(){ UserDao userDao = new UserDao(); userDao.setLable("2"); return userDao; }}
测试类
import org.junit.Test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class IOCTest { @Test public void test01(){ // 创建ioc容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); UserService bean = applicationContext.getBean(UserService.class); System.out.println(bean); // 关闭容器 applicationContext.close(); }}
@Autowired可以标注在构造器,参数,方法,属性
上;都是从容器中获取参数组件的值
使用方法自动装配。
// 默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作@Service@ToStringpublic class UserService { private UserDao userDao; //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值; //方法使用的参数,自定义类型的值从ioc容器中获取 @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; }}
使用构造器自动装配。
@Service、@Component注解,Spring容器会自动调用无参构造器。// 默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作@Service@ToStringpublic class UserService { private UserDao userDao; // 构造器上的参数对象从容器中获取 @Autowired UserService(UserDao userDao){ this.userDao = userDao; } // 或者 UserService(@Autowired UserDao userDao){ this.userDao = userDao; }}
自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware; 把Spring底层一些组件注入到自定义的Bean中; xxxAware:功能使用xxxProcessor; ApplicationContextAware==》ApplicationContextAwareProcessor;配置类:
package com.example.demo;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScan("com.example.demo")public class Config { }
自定义组件:
package com.example.demo;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanNameAware;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.context.EmbeddedValueResolverAware;import org.springframework.stereotype.Component;import org.springframework.util.StringValueResolver;@Component@ToStringpublic class Red implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void setBeanName(String name) { System.out.println("当前bean的名字:"+name); } @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { String resolveStringValue = resolver.resolveStringValue("你好 ${os.name} 我是 #{20*18}"); System.out.println("解析的字符串:"+resolveStringValue); }}
测试类:
@Testpublic void test01(){ // 创建ioc容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); Red bean = applicationContext.getBean(Red.class); System.out.println(bean); // 关闭容器 applicationContext.close();}
/** * Profile: * Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能; * * 开发环境、测试环境、生产环境; * 数据源:(/A)(/B)(/C); * * * @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件 * * 1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境 * 2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效 * 3)、没有标注环境标识的bean在,任何环境下都是加载的; */
配置类:
import com.mchange.v2.c3p0.ComboPooledDataSource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;import javax.sql.DataSource;@Configurationpublic class Config { @Profile("test") @Bean public DataSource dataSourceTest(){ DataSource dataSource = new ComboPooledDataSource(); return dataSource; } @Profile("dev") @Bean public DataSource dataSourceDev(){ DataSource dataSource = new ComboPooledDataSource(); return dataSource; }}
测试类:
1、使用命令行动态参数: 在虚拟机参数位置加载-Dspring.profiles.active=test
@Test public void test01() { // 创建ioc容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); String[] beans = applicationContext.getBeanNamesForType(DataSource.class); for (String bean : beans) { System.out.println(bean); } // 关闭容器 applicationContext.close(); }
2、代码的方式激活某种环境;
@Test public void test01() { // 创建ioc容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 1、创建一个applicationContext // 2、设置需要激活的环境 applicationContext.getEnvironment().setActiveProfiles("dev"); // 3、注册主配置类 applicationContext.register(Config.class); // 4、启动刷新容器 applicationContext.refresh(); String[] beans = applicationContext.getBeanNamesForType(DataSource.class); for (String bean : beans) { System.out.println(bean); } // 关闭容器 applicationContext.close(); }
转载地址:http://cgdhb.baihongyu.com/