Bean的管理包含两方面,一是创建Bean对象,二是注入属性,在上一节已经说明了 XML方式管理Bean,本节使用注解进行Bean的管理。
一、注解
1.什么是注解?
(1)注解是代码特殊标记,语法格式:@注解名称(属性名称=属性值,属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化xml配置
2.Spring实现Bean管理的常用注解
名称 | 作用 |
---|---|
@Component | 将Spring中的类标注为注解,可以用在任何层次(一般不使用) |
@Repository | 将数据访问层(DAO层)的类标识为Spring中的Bean |
@Service | 将业务层(Service层)的类标识为Spring中的Bean |
@Controller | 将控制层(Controller层)的类标识为Spring中的Bean |
@Autowired | 对Bean的属性变量、属性的setter方法进行标注,按照Bean的类型进行转配 |
@Resource | 作用与@Autowired一样,区别是@Resource默认按照Bean的名称进行装配,@Resource有两个属性name和type,Spring将name属性解析为Bean实例名称,type属性解析为Bean的实例类型 |
@Qualifier | 标注在属性上,根据属性名称进行属性注入 |
@Value | 标注在属性上,注入普通属性 |
二、注解方式管理Bean
使用注解方式实现对Bean的管理,需要在原本的基础上引入aop的jar包,具体如下共6个:
创建对象和注入属性,过程演示如下:
//UserDao接口
public interface UserDao {
public void say();
}
//UserService接口
public interface UserService {
public void say();
}
//UserDao的实现类UserDaoImpl
//不添加value属性,默认是类名的首字母小写
@Repository(value = "userDao")
public class UserDaoImpl implements UserDao {
@Override
public void say() {
System.out.println("userDao say Hello World...");
}
}
//UserService接口实现类UserServiceImpl
@Service(value = "userService")
public class UserServiceImpl implements UserService {
//@Resource(name = "userDao")
@Autowired
@Qualifier(value = "userDao")//必须配合@Autowired才可以使用,单独使用会报错:NullPointerException
private UserDao userDao;//使用注解方式注入属性时不需要setter方法
@Value(value = "独孤求败")//使用@Value注解注入普通属性
private String name;
@Override
public void say() {
this.userDao.say();
System.out.println("userService say Hello World...");
System.out.println("name = "+name);
}
}
配置文件beans.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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描,需要使用context命名空间,注意配置-->
<!--开启注解扫描,此时base-package属性下的子包中使用注解标注的类和属性都会自动诶Spring识别-->
<!--开启注解扫描,若多个包不在同一个父包下,可以使用“,”将多个包分隔开-->
<context:component-scan base-package="com.jd.annotation"></context:component-scan>
</beans>
测试:
@Test
public void annTest(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
userService.say();
}
扩展:
在上述的Spring配置文件中,base-package属性配置的包下的类和属性都会被扫描,为了提高效率,可以设置那些需要扫描,那些不需要扫描,具体如下:
知识延伸:完全注解开发
完全注解开发是指不需要Spring配置文件,使用配置类替代配置文件,具体如下:
(1)编写配置类,代替Spriing的配置文件;
//配置类,功能和上面的beans.xml功能相同
@Configuration//作为配置类,替代配置文件
@ComponentScan(basePackages = {"com.jd.annotation"})
public class SpringConfig {
}
(2)编写实现类
实现类就是上述的UserDao接口
、UserService接口
、UserDao实现类UserDaoImpl
和UserService实现类UserServiceImlp
(3)测试类
@Test
public void allAnnotationTest(){
//使用注解类后,创建Spring容器时,使用AnnotationConfigApplicationContext(SpringConfig.class)
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService);
userService.say();
}
完全注解开发了解即可,实际就是Spring Boot开发,关于Spring Boot技术后续会说明。