五、Spring IoC注解

一、概述

spring 基于注解的IoC与基于XML的IoC实现的功能是一样的,只是配置的形式不同而已

二、常用注解

1. 用于创建对象的注解:同bean标签
  • @Component spring 通用组件的注解
  • @Controller spring 表现层组件注解
  • @Service spring 服务层组件注解
  • @Repository spring 持久层组件注解

属性:value,用于指定组件的id,默认为类的名称,且首字母小写

<?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.lizza"/>

</beans>
@Component
public class UserServiceImpl implements UserService {

    @Override
    public void saveUser(){
        System.out.println("UserService: user saved!");
    }
}
2. 用于注入数据的注解:同property标签
  • @Autowired 自动按照类型注入,只要spring容器中有唯一的一个类型与被注入的bean类型相同的bean对象时,就可以注入成功
  1. 如果容器中没有对应类型的bean时,则报NoUniqueBeanDefinitionException异常
  2. 容器中有多个对应类型的bean时,用变量名称作为id在spring容器中查找对应的bean,若没有则报NoUniqueBeanDefinitionException异常
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}
@Repository("userDao1")
public class UserDao1Impl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("UserDao1: user saved!");
    }
}
@Repository("userDao2")
public class UserDao1Impl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("UserDao2: user saved!");
    }
}

上面会报NoUniqueBeanDefinitionException异常

  • @Qualifier 按照类型注入的基础上再按照bean的id去注入
  1. 在给类成员注入时,不能单独使用
  2. 在给方法参数注入时,可以单独使用
  3. 属性value,用于指定bean的id
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("userDao2")
    private UserDao userDao;

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}
  • @Resource: 按照id注入,可以独立使用
@Service
public class UserServiceImpl implements UserService {

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

    @Override
    public void saveUser(){
        userDao.saveUser();
    }
}

总结:以上的三个注解只能注入其他bean类型的数据,而不能注入基本类型和String类型的数据,另外集合类型的数据只能使用XML来注入

  • @Value 用于注入String类型和基本类型的数据,在注解的属性值中可以使用SpEL(Spring的el表达式),即:${表达式}
  1. 属性:value,用于指定属性的值
@Repository
public class UserDao1Impl implements UserDao {

    @Value("1")
    int index;

    @Override
    public void saveUser() {
        System.out.println("UserDao" + index + ": user saved!");
    }
}
3. 用于描述作用范围的注解:同scope属性
  • @Scope 指定bean的作用范围,常用取值:singleton,prototype;默认singleton
4. 用于配置生命周期的注解:同init-method和destroy-method属性
  • @PostConstruct 用于指定初始化的方法,执行完构造器之后会执行,可以注解多个
  • @PreDestroy 用于指定销毁方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章