【Spring】Bean对象的存取

目录

一、Spring项目的创建

1、创建maven项目

2、引入Spring依赖

3、创建启动类与main方法

二、Bean对象的手动存取

1、准备

2、存入

3、取出

1.获取到Spring上下文

2.通过getBean方法获取 

 3.getBean方法

三、Bean对象的自动存取

1、准备

2、存入

1.五大类注解

2.方法注解

3、取出

1.传统的读取

2.注解读取 

3.autowired与resource注解的区别



一、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对象的,我们还有两种方法进行获取

方法参数说明
getBeanString传入id进行获取
getBeanClass<T>通过传入类对象进行获取
getBeanString,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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值