上一篇文章简单介绍了Spring的创建和使用的过程。文中使用的的存储对象和读取对象方式是非常繁琐的,下面将为大家介绍更为简单的方式。
文章目录
存储Bean对象
1.配置Bean的扫描根路径
<?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=""></content:component-scan>
</beans>
在存储对象之前,配置存储对象的扫描包路径。在当前路径下,添加注解的会被扫描到,并存入Spring中。
2.使用注解
1.类注解
五大类注解
- @Controller
控制层,检测参数的合法性。 - @Service
服务层,要调用几个方法或者接口,业务组装 - @Repository
数据持久层,业务实现 - @Component
组件(工具层) - @Configuration
配置层,针对当前项目做一些设置
在当前类前添加上述五个类注解之一,就能够实现将这个类的对象注册到Spring容器中的功能。
@Controller
public class UserController {
public void beauty(){
System.out.println("你今天真漂亮!!!");
}
}
在获取对象时,默认的获取名字为当前类的首字母小写,
特殊情况:当首字母和第二个字母都是大写时,获取名字是类名。
2.方法注解
- @Bean
注意:需要与五大类注解配合使用,单独一个Bean注解是不够的。
把当前方法返回的对象存入Spring中。
@Component
public class Users {
@Bean //把当前方法返回的对象存入String中
public User getUser(){
User user=new User();
user.setId(1);
user.setName("陈宇");
user.setSex("男");
return user;
}
}
把user对象存入Spring中,getBean获取的默认名字是方法名。
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
User user=context.getBean("getUser", User.class);
System.out.println(user.toString());
结果:
重命名Bean
- @Bean(“”)
- @Bean(name=“”)
- @Bean(value=“”)(支持多个名称)
此时的getBean获取对象的名字就需要设置成注解内的名字了。
注意:重命名后,无法再通过原来的方法名获取对象了。
Spring通过@Bean注解存储Bean对象时,一个Bean对象可以有多个名字。但是如果不同对象具有相同的名字时,会怎么样。
不会报错。但只会在容器内存储一个。
存储哪一个呢?
如果是相同类型的不同对象,根据代码的执行顺序推断。代码的执行顺序是从上到下的。
如果是不同类型的不同对象,根据权重进行选择,权重越大,越先执行。
读取Bean对象
对象注入
把对象取出来放在某个类中。
1.属性注入
- 同类型对象只有一个,直接将此对象注入到当前属性上
通过@Autowired注解实现。
创建一个User对象。将User对象存入到Spring中。
把User类注入到UserService中:
对代码进行测试:
获取UserService对象,如果能够成功执行getUser方法,成功返回User对象。就表示User类注入UserService成功。
- 同类型对象有多个,根据名字来获取对象
1.直接改名字,改成存放进Spring的名字。
2.通过@Qualifier注解定义名称
- 优点:简单
- 缺点:
1.无法注入final修饰的变量。因为java规定final修饰的变量只能初始化的时候就定义或者在构造方法中定义。
2.只能在Ioc容器中使用。
3.不符合单一设计原则。
2.setter注入
通过setter方法注入,也需要设置@Autowired。
如果有多个同类型的对象,获取方式也是和属性注入一样的,要么直接改成Bean对象名字,要么通过@Qualifier注解实现。
- 优点:通常Setter只设置一个属性,不会设置多个,所以符合单一设计原则
- 缺点:
1.无法注入final修饰的变量。
2.setter注入的对象可以被修改。因为setter本来就是一个方法,可以被多次调用和修改。
3.构造方法注入(官方推荐)
如果只有一个构造方法的时候,@Autowired注解可以省略。
- 优点
1.可以定义被final修饰的变量。
2.注入的对象不会被修改,因为构造方法只执行一次。
3.构造方法注入可以保证注入对象完全初始化。
4.通用性更好,不局限于Ioc容器。
总结
Spring核心功能有存储对象和读取对象。
存储对象有两种方式:1.添加类注解 2.添加方法注解。
两种方法的前提是添加扫描目录。从添加的扫描目录下开始,扫描注解。
读取对象有依赖注入:1.属性注入 2.setter方法注入 3.构造方法注入