0


【Spring从入门到实战】第 3 讲:Spring中Bean的注入方式

本文已收录于专栏
🌲《Spring从入门到实战》🌲

专栏前言

   大家好,我是执梗。本专栏将从

Spring

入门开始讲起,详细讲解各类配置的使用以及原因,到使用

SpringBoot

进行开发实战,旨在记录学习生活的同时也希望能帮到大家,如果对您能有所帮助,还望能点赞关注该专栏,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。

目录

1.什么是Bean对象?

  我们上文以及讲过

Spring

的IOC容器,那么这个容器管理的对象,我们一般就成为

Bean

对象。我们以前平时生成一个对象,都是调用构造方法来

new

对象,对象都是由我们自己进行管理和生成,当我们将

User

对象托管给

Spring

管理后,此时的

User

就可以称之为是一个

Bean

对象,

Spring

可以帮我们去管理和生成对象,不需要我们自己去操作。
  当然并不是所有的对象

Spring

都得去帮我们管理,我们需要手动的去告诉它,这就是我们本文要讲的

Bean

注入方式

2.Bean的注入方式

1.XML注入

  这是

Spring

版本比较老的注入方式,当然现在大家都不怎么使用了,主要还是因为不方便,而且

XML

配置文件在

SpringBoot

中已经不使用了 。

1.1set注入

  在

Spring

XML

文件中,我们首先使用

Bean

标签注入我们需要注入的类,然后通过

property

标签的

value

属性完成赋值操作。它是基于注入类的

set

方法进行赋值的,如果

property

选择的属性没有

set

方法则会报错。
实体类代码:

@Data//自动注入所有get set方法,基于lombokpublicclassStudent{String name;String id;}
XML

文件:

<!--1 set方法注入属性--><beanid="student"class="com.beans.Student"><!--使用property完成属性注入,name:类里面属性名称,value:向属性注入的值 --><propertyname="name"value="张三"></property><propertyname="id"value="1"></property></bean>

主函数运行:

publicclassApp{publicstaticvoidmain(String[] args){//1.得到spring上下文对象ApplicationContext context=newClassPathXmlApplicationContext("application.xml");//2.根据上下文对象提供的上下文对象Student student=(Student)context.getBean("student");System.out.println(student);}}

正常打印
在这里插入图片描述

1.2构造方法注入

  这种注入方式也是在

XML

中进行,只不过我们使用的属性变成了

constructor-arg

,它基于的是构造方法的注入而不是我们的

set

方法了,需要我们的实体类提供对应的构造方法,否则也会报错。
实体类代码:

publicclassUser{String name;int id;publicUser(String name,int id){this.name = name;this.id = id;}}
XML

文件:

<!--2 有参数构造注入属性--><beanid="user"class="com.beans.User"><constructor-argname="name"value="李四"></constructor-arg><constructor-argname="id"value="2"></constructor-arg></bean>

主函数运行:

publicclassApp{publicstaticvoidmain(String[] args){//1.得到spring上下文对象ApplicationContext context=newClassPathXmlApplicationContext("application.xml")User user = context.getBean("user",User.class);System.out.println(user);}}

正常打印
在这里插入图片描述

1.3 P标签注入

  这种注入方法其实本质上和

set

注入没有区别,因为它也是基于

set

方法进行实现的,如果缺失

set

方法的话同样会报错,感觉就是对

set

注入进行的一种简化,看上去更加简洁。

XML

文件:

配置文件中请加入下面这行
xmlns:p="http://www.springframework.org/schema/p"
<!--3 p标签注入--><beanid="car"class="com.beans.Student"p:name="王五"p:id="3"/>

正常打印:
在这里插入图片描述

1.4静态工厂注入

  这种注入方式比较少见,它是调用静态工厂的静态方法来创建

Bean

,当我们需要对象时,只需要传入参数调用静态方法即可,不需要关心创建对象的细节问题。当然被注入的实体类同样需要提供

set

方法,它也是基于

set

注入实现。我们还需要再配置文件中配置静态工厂的路径和调用方法名以及参数。需要注意的是静态工厂中厂本身不需要创建,可以直接通过静态方法调用。

实体类:

@DatapublicclassUser{String name;int id;publicUser(){}}
XML

配置文件:

<!-- 静态工程(不需要创建工厂本身) --><!-- factory-method:指定哪个方法是工厂方法 --><beanid="createuser"class="com.beans.UserStaticFactory"factory-method="UserCreate"><!-- 可以为方法指定参数 --><constructor-argvalue="赵六"></constructor-arg><constructor-argvalue="6"></constructor-arg></bean>

主函数运行:

publicclassApp{publicstaticvoidmain(String[] args){//1.得到spring上下文对象ApplicationContext context=newClassPathXmlApplicationContext("application.xml");User user = context.getBean("createuser",User.class);System.out.println(user);}}

正常打印:
在这里插入图片描述

1.5实例工厂注入

  这个和上面的静态工厂有点类似,不同的区别在于实例工厂注入,我们首先需要把这个工厂注入进

Spring

。然后在注入实体类的时候我们需要指明我们使用的是哪一个注入的工厂以及调用的是工厂内的哪个方法,主要的区别就在于静态工厂是不需要注入工厂的,而我们实例工厂注入由于需要实例化工厂对象,所以需要讲工厂也注入进来。注意的是改方法注入同样依赖与

set

方法。

XML

配置

    此处是注入工厂
<beanid="factorname"class="com.beans.UserStaticFactory"></bean><!--
         factory-bean:指定当前对象创建使用哪个工厂
         factory-method:指定哪个方法是工厂方法
    --><beanid="student2"class="com.beans.UserStaticFactory"factory-bean="factorname"factory-method="UserCreate"><constructor-argvalue="李易峰"></constructor-arg><constructor-argvalue="6"></constructor-arg></bean>

主函数运行:

publicclassApp{publicstaticvoidmain(String[] args){//1.得到spring上下文对象ApplicationContext context=newClassPathXmlApplicationContext("application.xml");User user = context.getBean("student2",User.class);System.out.println(user);}}

正常打印:
在这里插入图片描述

3.XML注入的缺点

  当然现在主流开发都是使用的

SpringBoot

框架,我们一般不采用

XML

配置文件的方法去注入对象,主要它有以下缺点:

  • XML文件配置麻烦,占用资源,维护代码的同时还得维护配置文件
  • 当注入的实体类过多时,配置文件代码量很大,维护麻烦
  • 程序编译难以对配置文件进行验证,会产生运行时异常且难以发现

4.注解注入

  这是目前最主流的注入方式,我们只需要在我们需要注入的实体类上加上相应的注解就可以

Spring

我们需要去注入它。当然它也没有那么只能,你在任何地方写它都能识别到,我们首先需要配置包的扫描路径,这样它才会将该包下的所有添加注解的类注入。

application.xml

添加如下配置:

base-package="需要扫描的包路径"
<context:component-scanbase-package="com.beans"></context:component-scan>

[email protected]

@Controller

注解主要用于控制层,表明我们将该类注入进

Spring

管理,注意该类路径需要在扫描的包下。

实体类代码:

@ControllerpublicclassUserController{publicvoidsayHi(String name){System.out.println("Hi"+name);}}

主函数运行代码:
  这里需要注意的是我们类名叫

UserController

这种大驼峰命名,但是在通过

context

取对象时却是

userController

,这是

Spring

约定熟成的规矩。

publicclassApp{publicstaticvoidmain(String[] args){//1.得到spring上下文对象ApplicationContext context=newClassPathXmlApplicationContext("application.xml");UserController userController = context.getBean("userController",UserController.class);
        userController.sayHi("张飞");}}

正常运行:
在这里插入图片描述

[email protected]

  同样具有注入功能,只不过我们一般写在

Service

层。

@ServicepublicclassUserService{publicvoidsayHi(String name){System.out.println("Hi"+name);}}

[email protected]

  同样具有注入功能,我们一般用在数据访问层,也就是常说的

DAO

层。

@RepositorypublicclassUserRepository{publicvoidsayHi(String name){System.out.println("Hi"+name);}}

[email protected]

  同样具有注入功能,它指的是我们注入的是一个组件,那么什么是组件呢?我也说不清楚哈哈哈,反正不是使用上面的三种的情况下我们就使用该注解注入。

@ComponentpublicclassUserComponent{publicvoidsayHi(String name){System.out.println("Hi"+name);}}

[email protected]

  同样具有注入功能,它表示我们注入的类是一个配置类。

@ConfigurationpublicclassUserConfiguration{publicvoidsayHi(String name){System.out.println("Hi"+name);}}
标签: spring java 后端

本文转载自: https://blog.csdn.net/m0_57487901/article/details/127866512
版权归原作者 执 梗 所有, 如有侵权,请联系我们删除。

“【Spring从入门到实战】第 3 讲:Spring中Bean的注入方式”的评论:

还没有评论