Spring依赖注入的注解方式
作者:互联网
使用注解注入
环境准备
<!--告知spring在创建容器时扫描的包-->
<context:component-scan base-package="com.jz"/>
1、用于创建对象
相当于xml配置中的bean标签
- @Component:用于把当前类对象存入spring容器中
- 属性:value 用于指定bean的id。如果不写则默认为当前类名首字母小写。
@Component(value = "accountService")
实验:
类
@Component(value = "accountService")
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao = accountDao;
}
public void saveAccount() {
accountDao.saveAccount();
}
}
测试类
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
AccountService as = (AccountService) context.getBean("accountService");
System.out.println(as);
}
}
运行结果:
- @Controller:一般用在表现层
- @Service:一般用在业务层
- @Repository:一般用在持久层
- 以上三个注解它们的作用和属性与@Component是一样的,它们是spring框架为我们提供明确的三层使用的注解。
2、用于注入数据
相当于bean标签里面的property
-
@Autowired:自动按照类型注入。
-
作用
-
只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配可以匹配实现类实现的接口。就可以注入成功
-
如果IoC容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
-
如果IoC容器中有多个类型匹配时,先圈定出在容器中类型相同bean,再把圈定出来的根据要注入变量名称去跟bean id去匹配,如果能匹配上唯一一个就可以注入成功,反之失败。
-
-
出现位置:可以在变量上,也可以在方法上
-
细节:在使用注解注入时,set方法就不是必须要写的了。
-
实验:
bean1
@Repository("accountDao1")
public class AccountDaoImpl implements AccountDao {
public void saveAccount() {
System.out.println("保存账户。。。1。111");
}
}
bean2
@Repository("accountDao2")
public class AccountDaoImpl2 implements AccountDao {
public void saveAccount() {
System.out.println("保存账户。。。。22222");
}
}
service类
@Component("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao1 = null; // 此时有多个bean的类型相同,所以要改属性名
public void saveAccount() {
accountDao1.saveAccount();
}
}
测试类
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
AccountService as = (AccountService) context.getBean("accountService");
as.saveAccount();
}
}
运行结果:
-
@Qualifier:
- 作用:在按照类型注入的基础之上再按照名称注入,给类成员注入时必须依托于@Autowired,不能单独使用。但是给方法参数注入时,可以单独使用。
- 属性:value 用于指定注入bean的id
实验:
只需修改@Autowried实验中的service类
@Component("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
@Qualifier("accountDao2") // 加上它之后就不需要再改属性名了
private AccountDao accountDao = null;
public void saveAccount() {
accountDao.saveAccount();
}
}
运行结果:
-
@Resource
- 作用:直接按照bean的id注入。可以独立使用
- 属性:name 用于指定bean的id
实验:
只需修改@Autowired中service类
@Component("accountService")
public class AccountServiceImpl implements AccountService {
/*@Autowired
@Qualifier("accountDao2")*/
@Resource(name = "accountDao1")
private AccountDao accountDao = null;
public void saveAccount() {
accountDao.saveAccount();
}
}
运行结果:
-
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
-
另外,集合类型的注入只能通过XML来实现
-
@Value
-
作用:用于注入基本类型和String类型的数据
-
属性:value 用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
SpEL的写法:
${表达式}
-
3、用于改变作用范围
相当于bean标签中的scope
- @Scope:默认单例
- 作用:用于指定bean的作用范围
- 属性:value 指定范围的取值。常用取值:singleton prototype
实验:
Service类
@Component("accountService")
@Scope("prototype")
public class AccountServiceImpl implements AccountService {
/*@Autowired
@Qualifier("accountDao2")*/
@Resource(name = "accountDao1")
private AccountDao accountDao = null;
public void saveAccount() {
accountDao.saveAccount();
}
}
实验类:
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
AccountService as1 = (AccountService) context.getBean("accountService");
AccountService as2 = (AccountService) context.getBean("accountService");
System.out.println(as1 == as2);
}
}
运行结果:
4、和生命周期相关
相当于bean标签中使用的init-method 和 destroy-method的作用一样
- PreDestroy:用于指定销毁方法(单例模式)
- PostConstruct:用于指定初始化方法
实验:
service类
@Component("accountService")
@Scope("singleton")
public class AccountServiceImpl implements AccountService {
@Resource(name = "accountDao1")
private AccountDao accountDao = null;
public void saveAccount() {
accountDao.saveAccount();
}
@PostConstruct()
public void init(){
System.out.println("初始化方法执行了。。。");
}
@PreDestroy
public void destroy(){
System.out.println("销毁方法执行了。。。。");
}
}
测试类:
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
AccountService as1 = (AccountService) context.getBean("accountService");
as1.saveAccount();
context.close();
}
}
运行结果:
标签:依赖,accountDao,saveAccount,AccountService,Spring,void,bean,注解,public 来源: https://www.cnblogs.com/jianzha/p/12611071.html