Spring更加简单的读和取
一、将对象存储到Spring中
前置知识 配置扫描路径
在使用Spring框架时,我们需要告诉Spring哪些类需要被存储到Spring的容器中。可以通过 @ComponentScan
注解来配置扫描路径。比如:
<?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:content="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 https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.demo"></content:component-scan>
</beans>
Spring会扫描 com.demo
包及其子包下使用 类注解
注解的类,并将其存储到Spring容器中。
1.1 五大类注解
Spring提供了五大类注解:@Controller
、@Service
、@Repository
、@Component
和@Configuration
。这些注解分别对应了Spring中的五种不同的角色。
@Controller
:用于标注控制层组件,归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。@Service
:用于标注业务层组件,归属于服务层,调用持久化类实现相应功能。【直接与数据库交互,它类似于控制中心】@Repository
:用于标注数据访问组件,归属于持久层,是直接和数据库进行交互的。通常每一个表都对应一个@Repository。@Component
:用于标注其他组件,归属于公共工具类,提供某些公共方法。@Configuration
:用于标注配置类,归属于配置层,用来配置当前项目的一些信息。
案例
在spring核心项目中五大类注解五大类注解效果等价,在SpringMVC和springBoot项目中差别很大。
@Controller
class User {
//静态方法[全局工具方法]
//实例方法/普通方法[普通方法]
public User(){
System.out.println("执行了user的构造方法");
}
public String sayHi(){
return "HEllo";
}
}
class App {
public static void main(String[] args) {
BeanFactory context=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
User user=context.getBean("user",User.class);
System.out.println(user.sayHi());
}
}
1.2 方法注解
除了使用五大类注解外,我们还可以使用 @Bean
注解来将对象存储到Spring容器中。需要注意的是,使用 @Bean
注解的同时也需要使用其他的注解来标注对象的类型,比如:
@Controller
public class StudentBeans {
@Bean
public Student student1(){
//伪代码,构建对象
Student stu =new Student();
stu.setId(1);
stu.setName("张三");
stu.setAge(11);
return stu;
}
}
public class App {
public static void main(String[] args) {
// BeanFactory context=new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Student student =context.getBean("student1",Student.class);
System.out.println(student);
}
}
1.3 Bean的命名规则
Spring容器中存储的对象会以Bean的名称为唯一标识符。如果没有指定对象的名称,Spring会根据默认规则生成Bean的名称。默认情况下,Bean的名称与类名相同,但首字母小写。如果存在多个同一类型的Bean,可以通过指定名称来区分不同的Bean。如果首字母和第二字母都是大写,此时需要用原类名才能正确获取到Bean对象可以从底层代码看到这一现象
import java.beans.Introspector;
public class App {
public static void main(String[] args) {
String s1="UserInfo";
System.out.println("s1:"+ Introspector.decapitalize(s1));
String s2="USerInfo";
System.out.println("s2:"+ Introspector.decapitalize(s2));
String s3="userInfo";
System.out.println("s3:"+ Introspector.decapitalize(s3));
String s4="uSerInfo";
System.out.println("s4:"+ Introspector.decapitalize(s4));
}
}
1.4 思考 五大类注释用途与联系
五大类注解的用途和联系如下:
@Controller
、@Service
、@Repository
和@Component
注解都是用来将对象存储到Spring容器中。它们的具体区别在于注解所标注对象的角色不同。@Configuration
注解是用来标注配置类的,配置类中包含了一些Bean的配置信息。
二、从Spring中获取对象
2.1 方法
Spring提供了三种方式来从Spring容器中获取对象:属性注入、Setter注入和构造方法注入。
- 属性注入:
@Autowired
private UserService userService;
- Setter注入:
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
- 构造方法注入:
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
2.2 注入关键字
Spring中提供了两个关键字来注入对象:@Autowired
和@Resource
。
@Autowired
:自动装配,可以根据类型来进行匹配注入对象。@Resource
:根据名称进行匹配注入对象。
2.2.1 解决同一类型Bean报错问题
如果存在多个同一类型的Bean,Spring默认会报错。可以通过指定名称来指定注入对象,比如:
@Autowired
@Qualifier("userService2")
private UserService userService;
其中,@Qualifier
注解用于指定Bean的名称。