基于注解的IOC
- 注解的配置
-
- 导入jar包,具体需要的jar包如下
- 用于创建bean对象
- XML配置
- 注入数据
- 用于改变作用范围
- Spring的新注解
注解的配置
导入jar包,具体需要的jar包如下
- maven配置
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
用于创建bean对象
- @componet
- 作用:就相当于配置了一个bean标签
- 它出现的位置:类上面
- 属性:value。含义是指bean的id。当不写时,它有默认值。默认值是当前类的短名,首字母小写
- 由此注解衍生的三个注解
- @Controller 一般用于表现层
- @Service 一般用于业务层
- @Repository 一般用于持久层
- 他们和@Componet的作用以及属性一摸一样
@Service
public class CustomerServiceImpl implements ICustomerService{
private ICustomerDao customerDao;
public void setCustomerDao(ICustomerDao customerDao) {
this.customerDao = customerDao;
}
public void saveCustomer() {
System.out.println("业务层调用持久层");
}
}
XML配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置自动扫描仪 -->
<context:component-scan base-package="fujuspring.com.fuju.service"></context:component-scan>
</beans>
注入数据
- @Autowired
- 作用:自动按照类型注入
- 当我们使用注解注入的时候,set方法就不是必须的了
- 如果注入的bean在容器中类型不唯一时,它会把变量名称作为bean的id在容器中查找,找到后也会注入成功
- 如果没有找到一致的bean的id,则报错
- @Qualifier
- 作用:在自动按照类型注入的基础上,再按照bean的id注入,它在类成员注入数据时,不能独立使用,但是在给方法的形参注入数据时,可以独立使用
- 属性
- value:用于指定bean的id
- @Resource
- 作用:直接按照bean的id注入
- 属性:
- name:用于指定bean的id
- 属性:
- 作用:直接按照bean的id注入
- 以上三个注解都是用于注入其他bean类型的。用于注入基本类型和String类型需要使用Value
- @Value
- 作用:用于注入基本类型和String类型数据。可以借助spring的el表达式读取properties文件中的配置
- 属性:value:用于指定要注入的数据
== java代码 ==
@Repository("customerDaoImpl")
public class CustomerDaoImpl implements ICustomerDao {
public void saveCustomer() {
System.out.println("持久层保存了客户");
}
}
@Service("customerServiceImpl")
public class CustomerServiceImpl implements ICustomerService{
@Value("XXX")
private String name;
@Autowired
// @Qualifier("customerDaoImpl")
private ICustomerDao customerDao;
public void saveCustomer() {
System.out.println("业务层调用持久层"+name);
customerDao.saveCustomer();
}
}
用于改变作用范围
- @Scope
- 用于改变bean的作用范围
- 属性:value:用于指定范围的值
- 取值和xml中的scope属性的取值是一样的。singleton prototype request session globalsession
== java代码如下 ==
@Service("customerServiceImpl")
@Scope("prototype")
public class CustomerServiceImpl implements ICustomerService{
@Value("XXX")
private String name;
@Autowired
// @Qualifier("customerDaoImpl")
private ICustomerDao customerDao;
public void saveCustomer() {
System.out.println("业务层调用持久层"+name);
customerDao.saveCustomer();
}
}
Spring的新注解
- @ComponentScan
- 配置自动扫描
- @Bean
- 作用:它是把方法的返回值存在spring容器中,该注解有个属性有个name用于指定bean的ID,当不指定时,它有默认值,默认值是方法的名称
- @Configuration
- 作用:把当前类看做spring的配置类
- @Import
- 作用:导入其他配置类
- @PropertySource
- 作用:加载配置文件如jdbc.properties,可以解析占位符