@Component注解
默认注入的bean的id属性值为类名首字符小写
也可以在注入的时候指定id值
@Component()
public class BeanAnnotation {
public void say(){
System.out.println("SAY SOMETHING!");
}
}
BeanAnnotation annotation = (BeanAnnotation) applicationContext1.getBean("beanAnnotation");
annotation.say();
@Required注解
适用于bean属性的setter方法
表示该属性配置时必须被填充
public class BeanAnnotation {
private String name;
@Required
public void setName(String name) {
this.name = name;
}
public void say(){
System.out.println("SAY SOMETHING!");
}
}
<bean id="beanAnnotation" class="bean.annotation.BeanAnnotation">
<property name="name" value="heqianqian"/>
</bean>
BeanAnnotation annotation = (BeanAnnotation) applicationContext1.getBean("beanAnnotation");
annotation.say();
否则会报错
Caused by: org.springframework.beans.factory.BeanInitializationException: Property 'name' is required for bean 'beanAnnotation'CapableBeanFactory.java:553)
... 11 more
@Autowired注解
自动装配
可以用于bean的setter方法,构造器,构造函数
1.用在Field上
@Repository
public class AutoWiredDao {
public void say(){
System.out.println("Autowired....");
}
}
@Service
public class AutoWiredServiceImpl implements AutoWiredService {
@Autowired//加在bean上
private AutoWiredDao autoWiredDao;
@Override
public void say() {
autoWiredDao.say();
}
}
2.加在setter方法上
@Autowired//加在setter方法上
public void setAutoWiredDao(AutoWiredDao autoWiredDao) {
this.autoWiredDao = autoWiredDao;
}
3.加在构造函数上
@Autowired//加在constructor上
public AutoWiredServiceImpl(AutoWiredDao autoWiredDao) {
this.autoWiredDao = autoWiredDao;
}
4.加在List上 把对象放入List
5.加在Map上 把Id和对象放入Map
使用@Oreder进行排序 只对List有效
/**
* BeanInterface
* 测试@Autowired注解List,Map,Set
* Created by heqianqian on 2017/4/25.
*/
public interface BeanInterface {
}
/**
* BeanImplOne
* 测试@Autowired注解List,Map,Set
* Created by heqianqian on 2017/4/25.
*/
@Order(2)
@Component
public class BeanImplOne implements BeanInterface {
}
/**
* BeanImplTwo
* 测试@Autowired注解List,Map,Set
* Created by heqianqian on 2017/4/25.
*/
@Order(1)
@Component
public class BeanImplTwo implements BeanInterface {
}
@Component
public class BeanInvoker {
@Autowired
private List<BeanInterface> beanInterfaceList;
@Autowired
private Map<String, BeanInterface> beanInterfaceMap;
public void autowireList() {
System.out.println("===autowireList===");
if (null != beanInterfaceList) {
for (BeanInterface beanInterface : beanInterfaceList) {
System.out.println(beanInterface.getClass().getName());
}
} else {
System.out.println("beanInterfaceList is null");
}
}
public void autowireMap() {
System.out.println("===autowireMap===");
if (null != beanInterfaceMap) {
for (Map.Entry<String, BeanInterface> beanInterfaceEntry : beanInterfaceMap.entrySet()) {
System.out.println(beanInterfaceEntry.getKey() + " " + beanInterfaceEntry.getValue().getClass().getName());
}
} else {
System.out.println("beanInterfaceMap is null");
}
}
}
BeanInvoker beanInvoker = (BeanInvoker) applicationContext1.getBean("beanInvoker");
beanInvoker.autowireList();
beanInvoker.autowireMap();
输出结果
===autowireList===
bean.annotation.BeanImplTwo
bean.annotation.BeanImplOne
===autowireMap===
beanImplOne bean.annotation.BeanImplOne
beanImplTwo bean.annotation.BeanImplTwo
@Qualifier注解
按类型装配多个可能bean实例的情况,可以缩小范围或者指定唯一bean,也可以用于指定构造器参数或者方法参数
可以注解集合类型变量
@Autowired
@Qualifier("beanImplOne")
private BeanInterface beanInterface;
public void qualifier(){
System.out.println("===qualifier===");
if (beanInterface!=null){
System.out.println(beanInterface.getClass().getName());
}
}
@Bean注解
@Bean+@Configuration
用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于XML配置文件的<bean/>
@Configuration
public class AppConfig {
@Bean
public AutoWiredService myService(){
return new AutoWiredServiceImpl();
}
}
等同于在XML文件中配置
<bean id="myService" class="bean.annotation.AutoWiredServiceImpl"/>
bean没有指定name时默认id是方法的名称
@Bean+@Scope
@Bean默认的单例模式Singleton
使用@Scope的value属性指定作用域(singleton,prototype,request,session,global session)
proxyMode指定代理方式
@ImportResource,@PropertyResource和@Value注解
一般引入配置文件的方式
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="myDriverManager" class="bean.annotation.MyDriverManager">
<property name="url" value="${url}"/>
<property name="driver" value="${driver}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
url=jdbc:mysql://localhost:3306/pro_manage
driver=com.mysql.jdbc.Driver
username=root
password=root
使用注解引入配置文件的方法
public class MyDriverManager {
public MyDriverManager(String url, String driver, String username, String pwd) {
System.out.println("url:" + url);
System.out.println("driver:" + driver);
System.out.println("username:" + username);
System.out.println("pwd:" + pwd);
}
}
@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {
@Value("${url}")
private String url;
@Value("${driver}")
private String driver;
@Value("${username}")
private String username;
@Value("${password}")
private String password;
@Bean
public MyDriverManager myDriverManager() {
return new MyDriverManager(url, driver, username, password);
}
}
MyDriverManager myDriverManager = (MyDriverManager) applicationContext1.getBean("myDriverManager");
System.out.println(myDriverManager.getClass().getName());
输入结果
Loading XML bean definitions from class path resource [application-anno.xml]
url:jdbc:mysql://localhost:3306/pro_manage
driver:com.mysql.jdbc.Driver
username:heqianqian
pwd:root
===init StringStore===
Disconnected from the target VM, address: '127.0.0.1:53370', transport: 'socket'
bean.annotation.MyDriverManager
这里出现一个小问题
输入的username和配置文件的username不同 这里取到的是当前操作系统的用户名 所以建议修改配置文件 改成 数据库驱动.username的形式
jdbc.url=jdbc:mysql://localhost:3306/pro_manage
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
这样打印出来的结果就是正确的了
Loading XML bean definitions from class path resource [application-anno.xml]
url:jdbc:mysql://localhost:3306/pro_manage
driver:com.mysql.jdbc.Driver
username:root
pwd:root
===init StringStore===
bean.annotation.MyDriverManager
@Resource和@PostConstruct,@PreDestroy
没有显示指定name默认从属性名和setter方法得出
@Repository
public class ResouceDao {
public void save() {
System.out.println("ResouceDao Save");
}
@PostConstruct
public void init() {
System.out.println("ResouceDao Init");
}
@PreDestroy
public void destroy() {
System.out.println("ResouceDao Destroy");
}
}
@Service
public class ResourceService {
@Resource
private ResouceDao resouceDao;
//@Resource
//public void setResouceDao(ResouceDao resouceDao) {
// this.resouceDao = resouceDao;
//}
public void save() {
resouceDao.save();
}
}
ResourceService resourceService = (ResourceService) applicationContext1.getBean("resourceService");
resourceService.save();
JSR330
首先引入jar包
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Inject
等同于@AutoWired
可以用于构造器,Setters和类
@Named
与@Component等效