@Component
基本Bean注解,主要是使用注解的方式替代原有xml的
使用@Component 注解替代
使用:再类上使用
@Component(value = "userDao") //若没有配置value,默认使用类名作为beanName
public class UserDaoImpl implements UserDao {
}
在Spring配置xml中配置包扫描
<!-- 扫描指定包下的@Component注解 -->
<context:component-scan base-package="com.demo"></context:component-scan>
容器获取bean方式与之前相同
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Object userDao = context.getBean("userDao");
System.out.println(userDao);//com.demo.dao.impl.UserDaoImpl@101df177
其他注解
@Component的三个衍生注解
由于JavaEE开发是分层的,为了每层Bean标识的注解语义化更加明确,(
@Component又衍生出如下三个注解:
依赖注入
Bean依赖注入的注解,主要是使用注解的方式替代xml的
Spring主要提供如下注解,用于在Bean内部进行属性注入的:
@Autowired
写两个同类型的bean,名称不一样
@Repository(value = "userDao")
public class UserDaoImpl implements UserDao {
}@Repository(value = "userDao2")
public class UserDaoImpl2 implements UserDao {
}
目前单例池中有两个同类型(UserDao)的bean
userDao和userDao2
在UserServiceImpl中,使用@Autowired注入UserDao成员变量
@Autowired //根据类型注入,若同类型多个再根据name匹配,没有指定name就报错
private UserDao userDao1;//注入单例池中没有的bean
结果会报错,,没有指定的bean
此时可以通过@Autowired+@Qualifier来配置
@Autowired //根据类型注入,若同类型多个再根据name匹配,没有指定name就报错
@Qualifier(value = "userDao2") //指定beanName
private UserDao userDao1;
@Autowired写在方法上会根据参数类型进行匹配
下面有一个特殊的情况,参数写一个List
//@Autowired用在方法上,根据类型匹配(方法自动执行,不需要调用)
@Autowired
public void fullList(List<UserDao> list) {System.out.println("fullList:"+list);
}
结果:
fullList:[com.demo.dao.impl.UserDaoImpl@551bdc27, com.demo.dao.impl.UserDaoImpl2@58fdd99]
@Resource
@Resource(name = "userDao2") //先类型,有name就根据name
private UserDao userDao1;
相当于@Autowired+@Qualifier
非自定义Bean注解开发
非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化
使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称
PS:工厂方法所在类必须要被Spring管理
写一个类,其中方法返回指定类型,方法内创建对象
@Component //交给Spring管理
public class OtherBean {@Bean //默认通过方法名'dataSource'来配置beanNamepublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}
}
如果@Bean工厂方法需要参数的话,则有如下几种注入方式
使用@Autowired 根据类型自动进行Bean的匹配,@Autowired可以省略
使用@Qualifier 根据名称进行Bean的匹配
使用@Value 根据名称进行普通数据类型匹配,
@Component //交给Spring管理
public class OtherBean {@Bean //默认通过方法名'dataSource'来配置beanName,引用参数类型默认添加了@Autowiredpublic DataSource dataSource(@Value("${jdbc.driver}") String driverName,@Qualifier("userDao2")UserDao userDao) {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driverName);System.out.println(userDao);return druidDataSource;}
}
Spring配置类开发
使用各种注解代替Spring配置文件xml中的标签
@Configuration
@ComponentScan(basePackages = {"com.demo"}) //替代<context:component-scan>
@PropertySource(value = "classpath:jdbc.properties") //替代<context:property-placeholder>
@Import(value = {OtherBean.class}) //替代Import,引入OtherBean中定义的bean,OtherBean不再需要加@Component
public class SpringConfig {
}
使用配置类的方式加载ApplicationContext,使用AnnotationConfigApplicationContext实现类
public class ApplicationContextTest {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);Object dataSource = applicationContext.getBean("dataSource");System.out.println(dataSource);}
}
Spring配置其他注解
@Primary
扩展:@Primary注解用于标注相同类型的Bean优先被使用权,@Primary是Spring3.0引入的,与@Component和@Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过@Autowired根据类型进行注入时会选用优先级更高的
@Profile
注解 @Profile 标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活了当前环境,能被注册到Sprng容器里,不指定环境的Bean,任何环境下都能注册到Spring容器里(公共环境)。
可以使用以下两种方式指定被激活的环境:
使用命令行动态参数,虚拟机参数位置加载-Dspring.profiles.active=test
使用代码的方式设置环境变量 System.setProperty("spring.profiles.active","test”);