基于注解装配
Spring框架为了方便开发者,给开发者提供了一系列的注解,来简化开发的过程。
注解分别有@Component 、@Repository、@Service、@Controller、@Autowired、@Resource、@Qualifier
@Component注解
这个注解是一个泛化的概念,代表一个组件对象(Bean),@Component注解可以代替上面前6个注解使用,可以作用在任何层次上面使用。
@Repository注解
这个注解应用于数据访问层(DAO)标识作为一个Bean,其标注的意思就是告诉Spring框架,给该类创建对应的实例对象
@Service注解
该注解标注在业务层,表示把该业务对象交给Spring管理,并给该类创建相应的实例对象。
@Controller注解
该注解用于标识一个控制器类组件(在SpringMVC模块中存在)
@Autowired注解
该注解对类的成员变量方法及构造方法进行标注,完成自动装配工作,同时也消除了成员变量的setter方法和getter方法。
注意
1.默认是根据被标注的对象类型来注入的,如果找到,直接使用setter方法或者字段进行注入
2.如果Spring上下文中找到对个匹配的类型,则在按照名字进行匹配,匹配不到者报错。
3.可以使用@Qualifier(“other”) 注解来规定依赖的对象安装bean的id和类型的组合方式进行匹配。
@Resource注解
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入
@Resource注解和@Autowired注解区别:
@Autowired注解默认是根据对象的类型来装配注入的 而@Resource注解默认是根据名称来装配注入
如果使用了上述注解我们者需要在主配置文件编写如下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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置Ioc注解解析器 扫描包-->
<context:component-scan base-package="com.iarchie.spring.auto"/>
<!-- 配置DI注解解析器 DI注入-->
<context:annotation-config/>
</beans>
注意关于Spring配置文件的命名默认全局使用的是applicationContext.xml,但是我们编写测试的时候可以这样写,如 XXX-context.xml Spring都会默认识别。
基于注解的IOC案例
1.我们新建立一个DAO层分别对应的一个接口一个实现类,在建立Service层,对应的一个接口一个实现类。
2.编写DAO层
//DAO接口
package com.iarchie.spring.auto.dao;
public interface EmployeeDAO {
void sayHello();
}
//DAO实现类,实现上面的接口
import org.springframework.stereotype.Repository;
import com.iarchie.spring.auto.dao.EmployeeDAO;
/**
*
* <p>Title: EmployeeDAOImpl.java</p>
* <p>Description: DAO实现类 </p>
* @author iArchie
* @date 2019年3月1日
* @version 1.0
*/
@Repository //表示该层是DAO层并交给Spring容器管理并实例化,默认bean名字为employeeDAO
public class EmployeeDAOImpl implements EmployeeDAO {
@Override
public void sayHello() {
System.out.println("EmployeeDAO 方法.....");
}
}
3.编写业务层
4.编写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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Ioc注解解析器 --> <context:component-scan base-package="com.iarchie.spring.auto"/> <!-- 配置DI注解解析器 --> <context:annotation-config/> </beans>
//Service接口
package com.iarchie.spring.auto.service;
public interface EmployeeService {
void sayHello();
}
//实现上面的Service接口
package com.iarchie.spring.auto.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iarchie.spring.auto.dao.EmployeeDAO;
import com.iarchie.spring.auto.service.EmployeeService;
/**
*
* <p>Title: EmployeeServiceImpl.java</p>
* <p>Description: 业务层 </p>
* @author iArchie
* @date 2019年3月1日
* @version 1.0
*/
@Service //贴上该注解表示业务层,交给Spring管理并实例化,默认bean名字为employeeService
public class EmployeeServiceImpl implements EmployeeService {
//自动注入DAO组件
@Autowired
private EmployeeDAO employeeDAO;
@Override
public void sayHello() {
employeeDAO.sayHello();
}
}
5.编写测试,使用Spring提供的测试
package com.iarchie.spring.auto;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import com.iarchie.spring.auto.service.EmployeeService;
@SpringJUnitConfig //Spring5提供的测试
public class AppTest {
// 注入业务层
@Autowired
private EmployeeService employeeService;
@Test
void test() {
employeeService.sayHello();
}
}
执行看到如下结果,表示基于注解的IOC案例已经测试成功!
信息: Refreshing org.springframework.context.support.GenericApplicationContext@130f889: startup date [Fri Mar 01 16:09:15 CST 2019]; root of context hierarchy EmployeeDAO 方法.....