Spring(3)之注解配置IoC

Spring(3)之注解配置IoC

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

准备

1、要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下:

image.png

2、在 applicationContext.xml 中引入 context 约束:

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!--配置文件约束在 spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 下可以找到-->
</beans>

简单使用

1、创建测试 Dao 接口:

// com.zze.dao.UserDao
package com.zze.dao;

public interface UserDao {
    void save();
}

2、创建 Dao 接口的实现类并使用注入注解:

// com.zze.dao.impl.UserDaoImpl
package com.zze.dao.impl;

import com.zze.dao.UserDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 实例化当前类并将其交给 Spring 管理
 * 相当于在配置文件中配置 <bean id="userDao" class="com.zze.dao.impl.UserDaoImpl"/>
 */
@Component("userDao")
public class UserDaoImpl implements UserDao {
    /*
    给属性注入值
     */
    @Value("张三")
    private String name;

    /*
    如果提供了 set 方法,则可在 set 方法上加上注解
     */
//    @Value("张三")
//    public void setName(String name) {
//        this.name = name;
//    }

    @Override
    public void save() {
        System.out.println("from UserDaoImpl.save()" + name);
    }
}

3、配置注解扫描包:

<!-- applicationContext.xml -->
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!--使用 IoC 注解开发,配置注解扫描的包(哪些包下使用了 IoC 注解)-->
    <context:component-scan base-package="com.zze.dao"/>
</beans>

4、测试使用:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();

常用注解

Spring 提供的常用基础注解大致可以分为如下几类:

注册 Bean 到容器

  • @Component:修饰一个类,将这个类实例交给 Spring 管理。
  • @Controller@Component 的衍生注解,功能与之相同,用来修饰 Web(显示)层的类。
  • @Service@Component 的衍生注解,功能与之相同,用来修饰 Service(服务)层的类。
  • @Repository@Component 的衍生注解,功能与之相同,用来修饰 Dao(持久)层的类。

属性注入

  • @Value:给基本类型属性注入值。
  • @Autowried:默认是按照类型在 IoC 容器中找到对应的实例注入。如果想按照名称匹配完成属性注入,可以同时再使用一个注解 @Qualifier 来指定要注入对象的名称。
@Autowired
@Qualifier("userDao")
private UserDao userDao;

@Resource:可以看做是 @Autowried@Qualifier 注解的结合体。默认不指定 name 属性时是根据对象类型匹配完成属性注入,指定了 name 属性时则会按照 name 值在 IoC 容器找到指定 name 的实例注入。

@Resource(name = "userDao")
private UserDao userDao;

生命周期

  • @PostConstruct:修饰一个方法,让其在实例化时执行,相当于在 bean 标签中指定 init-method
  • @PreDestroy:修饰一个方法,让其在实例销毁之前执行,相当于在 bean 标签中指定 destroy-method

作用范围

  • @Scope:修饰一个类,指定其作用范围。

value 有如下几个可选值:

  • singleton:默认值,Spring 会采用单例模式创建这个对象。
  • prototype:多例的。
  • request:应用在 web 项目中,Spring 创建这个类对象后,将这个对象存放到 request 范围中。
  • session:应用在 web 项目中,Spring 创建这个类对象后,将这个对象存放到 session 范围中。
  • globalsession :应用在 web 项目中,必须在 porlet 环境下使用。

IoC 的 XML 和注解配置对比

  • XML 方式:结构清晰,维护方便,适用于任意场景。
  • 注解方式:简易开发,当一个类不是自己编写而是由第三方提供时,不可以使用。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/spring3.html

Buy me a cup of coffee ☕.