天天看点

SpringIoC容器 之注解装配基于注解装配

基于注解装配

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都会默认识别。

SpringIoC容器 之注解装配基于注解装配

基于注解的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 方法.....