目录
一、Spring项目的创建
1、创建maven项目
2、引入Spring依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
3、创建启动类与main方法
二、Bean对象的手动存取
1、准备
在项目目录里的resources目录下创建xxx.xml文件,此时需要记住这个文件的名字,在后续获取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">
<bean id="获取时通过此id获取" class="User"></bean>
</beans>
创建一个要存入Spring的User类
2、存入
将上述代码粘贴进该xml文件后,通过bean标签进行存入。id属性内容在后续获取bean对象的时候,通过该id属性的值进行获取,class属性就是要存入spring的对象路径,如果我们把上述创建的User类存入Spring,就可以通过bean标签实现
此时就把这个user对象存入了Spring
3、取出
1.获取到Spring上下文
首先,我们要先获取到Spring的上下文,也就是创建一个Spring实例
有两种方法得到上下文:一种是通过
ApplicationContext context = new ClassPathXmlApplicationContext("之前在recourses目录里创建的xml文件");
一种是通过
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("之前在recourses目录里创建的xml文件"));
2.通过getBean方法获取
然后通过上述获取到的上下文对象进行获取,我们之前将User存入到了Spring里,现在我们可以通过存入时bean标签里的id来获取到它,然后调用它的hello方法看是否获取到
3.getBean方法
上面我们在获取的时候是通过id进行获取User对象的,我们还有两种方法进行获取
方法 | 参数 | 说明 |
getBean | String | 传入id进行获取 |
getBean | Class<T> | 通过传入类对象进行获取 |
getBean | String,Class<T> | 上述二者的结合 |
注意:其实通过id获取与通过类对象进行获取都有一定的风险,如果使用id进行获取时,我们在之前没有注入或id填写错误,拿到了一个null,然后在对null进行强转。如果使用类对象进行获取时,我们在注入时注入了多次,此时Spring就不知道要获取哪一个而报错。此时第三种就结局了这两种风险,所以推荐使用第三种
三、Bean对象的自动存取
当Bean对象越来越多的时候,上述手动注入就略显麻烦了,此时我们可以通过注解来实现自动存取
1、准备
我们需要在之前recourses目录下的xml文件里配置一下扫描路径,去扫描有哪些Bean对象要存入Spring
<?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">
<bean id="获取时通过此id获取" class="User"></bean>
<content:component-scan base-package="扫描路径"></content:component-scan>
</beans>
如果要扫描全部路径,可以使用**
2、存入
通过注解存入有两种方法:1.通过五大类注解 2.方法注解
1.五大类注解
可以在类上加一下注解,即可自动注入spring,五大类注解的区别在SpringBoot、SpringMVC里有不同,在spring里注意通过注解来了解当前类的用途,透明任意一个都可以将对象注入spring
注解 | 说明 |
@Controller | 属于业务逻辑层,用来控制用户的行为,检查用户传递参数的有效性 |
@Configuration | 属于配置层,用来配置一些项目信息,比如拦截器 |
@Component | 属于公共类,提供一些公共的方法 |
@Service | 属于服务层,协调业务进行调用持久层类的相关操作 |
@Reository | 属于持久层,直接与数据库进行交互 |
2.方法注解
通过bean注解进行注入,在方法上加@Bean注解,并且在类上加上五大注解即可将方法的返回值注入spring里
3、取出
1.传统的读取
上述注解注入相当于通过bean标签进行注入时,id设置为类名的第一个字母小写,所以我们获取的时候也可以通过上述的getbean方法进行获取,但是此时就有问题了:如果类名首字母就是小写、类名开头两首字母都大写
首先来看正常情况下获取:
其次看类名的第一个字母小写,它与上述获取时相同即小写首字母
最后来看前两个字母大写,我们可以直接通过类名获取
那么为什么会这样的,我们看一下底层的源码就明白了
通过方法注入的bean对象在获取时,可以通过getbean(方法名,类对象)进行获取,但是如果在方法注入时bean注解使用了name属性,在获取时就不能通过方法名来获取,只能通过name属性的值来进行获取。
2.注解读取
我们可以通过autowired这个注解来进行自动获取bean对象,有三种方法
注入方式 | 特点 |
属性注入 | 实现简单,使用也简单,但是无法注入一个不可变对象。容易违背单一设计原则 |
构造方法注入 | 支持不可变对象的注入,注入的对象会被完全初始化,且通用性好,不在IoC容器里也可以执行,但是相对复制 |
setter方法注入 | 符合单元设计原则,也不能注入不可变对象,此set方法可被多次调用 |
实现:
我们也可以通过jdk自带的注解@resource通过属性与setter方法注入,他不支持构造方法注入
那么这两个注解有什么区别呢
3.autowired与resource注解的区别
相同点:都可以在spring里拿到bean对象
不同点:
功能不同:前者支持三种注入,后者不支持构造方法注入。
参数支持不同:当一个对象通过Bean注解方法存入的时候此时如果有两个方法进行了存入,resource就可以通过属性name设置为具体方法名去注入对象,autowired不行他需要搭配qualifier(方法名)注解去达到resource的name属性的效果
出身不同:前置来自spring后者来自jdk