Spring注入的方式

简介: 注入方式可以分为xml 方式、注解方式
勿将今日事留到明日

方式几种

整体可以分为:xml 方式、注解方式

  • xml

    • 手动: 构造方法(constructor-arg)、set方法(property)
    • 自动:byName、byType、constructor

xml方式

手动

我们先来看下每种方式是怎么使用的!

构造方法

提供两个类,一个是 OrderService,另外一个是 UserServiceUserService 中包含OrderService 属性,一个test方法,一个有参构造方法和一个无参构造方法

public class OrderService {
}

public class UserService {

    OrderService orderService;

    public UserService(){
        System.out.println("xml 无参构造注入" + orderService);
    }
    public UserService(OrderService orderService1){
        System.out.println("xml 有参构造注入" + orderService1);
        orderService = orderService1;
    }
    
    public void test(){
        System.out.println(orderService);
    }
}

我们可以看一下 xml 中的配置方式, constructor-arg 标签

<bean class="com.gongj.populateBean.OrderService" id="orderService"></bean>

<bean class="com.gongj.populateBean.UserService" id="userService">
   <constructor-arg index="0" ref="orderService"></constructor-arg>
</bean>
验证
public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config2.xml");
        UserService bean = context.getBean(UserService.class);
        bean.test();
}
结果:
xml 有参构造注入com.gongj.populateBean.OrderService@14514713
com.gongj.populateBean.OrderService@14514713

set方式

新增一个setOrder方法。这个setOrder方法用来注入 OrderService 的。


    public void setOrder(OrderService order){
        System.out.println("xml property方法注入" + order);
        orderService = order;
    }

修改 xml 中的配置方式,注意看 UserService的配置,将 constructor-arg 标签修改为了 property 标签,name 配置的值是 UserService 类中 setOrder的名称(省略set并首字母小写) ,ref 配置的值是上方OrderServiceid属性值,也就是 beanName

    <bean class="com.gongj.populateBean.OrderService" id="orderService">
    </bean>

    <bean class="com.gongj.populateBean.UserService" id="userService">
        <property name="order" ref="orderService"></property>
    </bean>
set方式验证
xml 无参构造注入null
xml property方法注入com.gongj.populateBean.OrderService@255316f2
com.gongj.populateBean.OrderService@255316f2

没有指定构造方法,默认走无参构造。

自动

先提一下 bean 标签里有个属性 autowire,这个属性的值有五种情况:nobyNamebyTypeconstructorautodetect

  • no:默认值,也就是不使用自动注入,也就是上面那种两种手动方式,在 xml 中配置 property标签或者 constructor-arg标签
  • byName:根据实体类中的set方法名称进行自动注入,不需要再配置 property标签
  • byType:根据实体类中的set方法的参数类型进行自动注入。
  • constructor:根据构造函数进行匹配,不需要再配置 constructor-arg标签。
  • autodetect:如果有默认的构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配,Spring3.0被弃用。

byName

  • 反例:
public void setOrder(OrderService order){
        orderService = order;
}

就根据 order 这个名称(省略set并首字母小写)作为 beanName 去寻找Bean。如果找到了对应的Bean,才会将 Bean 赋值给方法的参数,并执行set方法。否则不会发生任何改变。(PS:当然在本例中,根据 order 这个名称是找不到 bean的,因为在xml配置的 beanName 叫 orderService,所以需要增加 set 方法并方法名称为 setOrderService

  • 正例
public void setOrderService(OrderService order){
        System.out.println("byName 方法注入" + order);
        orderService = order;
}
结果:
xml 无参构造注入null
byName 方法注入com.gongj.populateBean.OrderService@255316f2
com.gongj.populateBean.OrderService@25531

byType

根据 OrderService这个类型去寻找。如果找到多个相同类型则抛出异常。只需将byName修改为byType就会出现下面这种情况:

结果:
xml 无参构造注入null
xml property方法注入com.gongj.populateBean.OrderService@6e5e91e4
byName 方法注入com.gongj.populateBean.OrderService@6e5e91e4
com.gongj.populateBean.OrderService@6e5e91e4

这是由于 setOrder方法与setOrderService方法的参数类型都是 OrderService

constructor

在之前 UserService的基础上再增加一个有参构造方法。将byType修改为constructor

  • 示例
public UserService(OrderService orderService1,OrderService orderService2){
        System.out.println("两个参数有参构造注入" + orderService1 +"==="+ orderService2);
        orderService = orderService1;
}
结果:
两个参数有参构造注入com.gongj.populateBean.OrderService@46fbb2c1===com.gongj.populateBean.OrderService@46fbb2c1
com.gongj.populateBean.OrderService@46fbb2c1

如果有多个构造方法,会调用参数多的那个构造方法。

注解方式

随着 Spring 的发展,许许多多的注解可以替换xml的配置了,比如 @Bean替换了<bean>@Scope替换了 scope@Autowired 替换了 autowire 等等。我们这篇就使用一下 @Autowired的注入方式。

使用 @Autowired 注解了呢,就可以省略上面所写的 set 方法了。

public class UserService {
    @Autowired
    OrderService orderService;

    public void test(){
        System.out.println(orderService);
    }
}

可以看到UserService类里面就变得很简洁了。由于这里使用的是 ClassPathXmlApplicationContext这个容器,所以需要在 xml 中增加配置,如下:

<context:annotation-config/>

这个配置的作用是:激活已经在Spring容器里注册过的bean,我们已经通过 xml 的方式向 Spring 注册 Bean了。

当然你可能会觉得既然我都使用注解了,为什么还要在 xml 中注册 bean 呢?如果你有这种想法,你可以使用下面一种方式,在 xml 中增加配置,指定扫描包路径,如下:

<context:component-scan base-package="com.gongj.populateBean"/>

作用:具备 <context:annotation-config> 的所有功能,还可以扫描指定的 package 下面的类并注册为bean。

在类上加上注解Component,将该类注册到 Spring 容器中

@Component
public class UserService {}

如果你完全都不想有 xml 文件,那你可以使用如下方式:

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppApplication.class);

切换容器,使用AnnotationConfigApplicationContext

新增 AppApplication类,类的内容如下:

@ComponentScan(basePackages = {"com.gongj.populateBean"})
public class AppApplication {
}

使用 ComponentScan注解指定扫描包路径。上述代码不再概述。

OK!我们回到正题 @Autowired 注解。使用了Autowired 注解之后,我们可以省略掉 set 方法,增加了我们的摸鱼时间 (* ̄︶ ̄)!

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。
相关文章
|
4月前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
64 3
|
1月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
23天前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
27 0
|
23天前
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
30 0
|
2月前
|
Java Spring
spring注入的几种方式
spring注入的几种方式
18 0
|
3月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves
|
3月前
spring-boot报错循环注入报错:has been injected into other beans
spring-boot报错循环注入报错:has been injected into other beans
206 3
|
3月前
|
Java Linux 程序员
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
|
4月前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
44 4
|
3月前
|
SQL 安全 Java
Spring Boot中的跨站点脚本攻击(XSS)与SQL注入防护
【6月更文挑战第15天】在现代Web应用程序开发中,安全性是一个至关重要的课题。跨站点脚本攻击(XSS)和SQL注入是最常见的两种攻击类型,它们可以严重威胁到应用程序的安全。
458 0