一、基于注解管理Bean
1.概述:
从Java5开始,Java增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息。
2.配置流程:
(1)引入相关依赖
(2)开启组件扫描:
Spring默认不使用注解装配Bean,因此我们需要在Spring的XML配置中,通过context:component-scan元素开启Spring Beans的自动扫描功能。开启此功能后,Spring会自动从扫描指定的包(back-package属性设置)及其子包下的所有类,如果类上使用了@Component注解,就将该类装配到容器中。
注意要在xml文件中配置context作用域。
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启组件扫描-->
<context:component-scan base-package="your pakagename"> </context:component-scan>
</beans>
(3)使用注解定义Bean
Spring提供了以下多个注解,这些注解可以直接标注在Java类上,将它们定义成Spring Bean。
注解 | 说明 |
@Component | 该注解用于描述Spring中的Bean,是一个泛化的概念,仅仅表示容器的一个组件(Bean),并且可以作用在应用的任何层次,例如Service层,Dao层等。使用时只需将该注解标注在相应的类上即可。 |
@Repository | 该注解用于将数据访问层(Dao层)的类标识为Spring中的Bean,其功能与@Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。 |
各个组件中的(value = "xxx")中,value值就相当于使用xml配置bean中的id值。
package com.atguigu;
import org.springframework.stereotype.Component;
//在测试类中,用context.getBean("user")来获取bean
@Component(value = "user")
public class User {
public User(){
System.out.println("创建了用户对象");
}
}
二、@Autowired注入
1.单独使用@Autowired注解,默认根据类型装配。
2.注入方式:
(1)通过属性注入:根据类型找到对应类对象,完成注入
@Autowire
private UserDao userDao;
(2)set方法注入
private UserDao userDao
@Autowired
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
(3)构造方法注入
@Autowired
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
(4)当只有一个构造函数时,可以不加注解
三、@Resource注入
1.概念:
@Resource注解也可以完成属性注入。它和@Autowired注解有什么区别?
Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更具有通用性。
@Autowired注解是Spring框架自己的
@Resource注解默认根据属性名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动通过类型byType装配。
@Autowired注解默认根据类型装配byType。如果想根据名称装配,需要配合@Qualifier一起使用。
@Resource注解用在属性上、setter方法上。
@Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。
@Resource注解属于JDK扩展包,需要额外引入依赖:
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.1.1</version>
</dependency>
四、全注解式开发
添加配置类,实现对注解的扫描,替代在xml文件中的组件扫描。
package com.atguigu;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration//配置类
@ComponentScan("com.atguigu")
public class Config {
}
现在,直接在测试类中加载配置类就可以扫描并获取bean。
package com.atguigu;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
User user = context.getBean(User.class);
System.out.println(user);
}
}