Spring基于注解的Ioc配置

首先需要建立的认知是:注解配置XML配置要实现的功能 (都是为了降低程序间的耦合) 都是一样的,只是形式上的区别。
不管是XML配置还是注解配置都需要Sping的jar包的支持,所以开始之前都需要导入jar包

  <!--Spring开发包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>

编写业务层,以及添加注解

/**
 * 账户业务层接口
 */
public interface AccountService {

    /**
     * 保存账户
     */
    void saveAccount();
}
/**
 * 账户的业务层实现类
 */
@Component(value = "accountService")
public class AccountServiceImpl implements AccountService {

    public void saveAccount() {
        System.out.println("调用了业务层方法......");
    }
}
注解 功能
@Component 把资源让Spring来管理,相当于在XML中配置一个bean

属性value:相当于XML配置bean标签的id属性,如果不指定value属性值,默认值为当前类名,首字母小写。
@Component注解的三个衍生注解
三个衍生注解和@Component 注解的作用以及属性是一模一样的,只是标明所用层

注解 功能
@Controller 相当于在XML中配置一个bean, 一般用于表现层的注解
@Service 相当于在XML中配置一个bean, 一般用于业务层的注解
@Repository 相当于在XML中配置一个bean, 一般用于持久层的注解

那么我们则可以把上面实例代码中的@Component替换为@Service
编写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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        <!--Spring创建容器时 需要扫描的包-->
        <context:component-scan base-package="com.liang.service"></context:component-scan>
</beans>

编写测试方法

    @Test
    public void configTest()
    {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        AccountService accountService = (AccountService)applicationContext.getBean("accountService");
        System.out.println(accountService);
        accountService.saveAccount();
    }

业务层测试完毕 接下来测试持久层,以及关联各层。
编写持久层,以及添加注解

public interface AccountDao {
    /**
     * 保存账户
     */
    void saveAccount();
}
@Repository(value = "accountDao")
public class AccountDaoImpl implements AccountDao {

    public void saveAccount() {
        System.out.println("保存了账户");
    }
}

修改业务层,以及添加注解
修改方式一

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
注解 功能
@Autowired 自动按照数据类型注入,但只能注入其他bean类型,当容器中有唯一的bean对象类型和注入的变量类型匹配时,注入成功。如果容器中有多个类型匹配时候,则在类型匹配的基础上寻找bean的value值和注入的变量名相同的,没有相同的则报错。 (使用注解注入属性时,set方法可以省略)

在这里插入图片描述
修改方式二

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    @Qualifier(value = "accountDao")
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
注解 功能
@Qualifier 在自动注入的基础上,在按照bean的id值注入,此注解在注入属性时,不能独立使用,必须和@Autowired配合使用

修改方式三

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Resource(name = "accountDao")
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
注解 功能
@Resource 直接按照bean的di值注入,属性name用于指定bean的id(value)值

修改XML配置

  <!--Spring创建容器时 需要扫描的包-->
        <context:component-scan base-package="com.liang"></context:component-scan>

进行测试

    @Test
    public void configTest()
    {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        AccountService accountService = (AccountService)applicationContext.getBean("accountService");
        System.out.println(accountService);
        accountService.saveAccount();
    }

以上三种注入属性的方式,都只能注入其他bean类型,无法注入基本类型、String类型和集合类型数据。
基本类型、String类型注入

注解 功能
@Value 注入基本类型和String类型的数据 属性value用于指定值

集合类型数据只能XML配置
补充注解

注解 功能
@Scope 指定bean的作用范围, value属性取值 singleton、prototype、request、session、globalsession
@PostConstruct 用于指定初始化方法
@PreDestroy 用于指定销毁方法
发布了71 篇原创文章 · 获赞 6 · 访问量 5384
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章