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 方法,增加了我们的摸鱼时间 (* ̄︶ ̄)!

  • 如你对本文有疑问或本文有错误之处,欢迎评论留言指出。如觉得本文对你有所帮助,欢迎点赞和关注。
相关文章
|
28天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
1月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
31 1
|
3月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
3月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
44 0
|
3月前
|
安全 Java 开发者
开发者必看!@Resource与private final的较量,Spring Boot注入技巧大揭秘,你不可不知的细节!
【8月更文挑战第29天】Spring Boot作为热门Java框架,其依赖注入机制备受关注。本文通过对比@Resource(JSR-250规范)和@Autowired(Spring特有),并结合private final声明的字段注入,详细探讨了两者的区别与应用场景。通过示例代码展示了@Resource按名称注入及@Autowired按类型注入的特点,并分析了它们在注入时机、依赖性、线程安全性和单一职责原则方面的差异,帮助开发者根据具体需求选择最合适的注入策略。
140 0
|
4月前
|
Java Spring
spring注入的几种方式
spring注入的几种方式
26 0
|
5月前
|
Java Spring 容器
spring如何进行依赖注入,通过set方法把Dao注入到serves
spring如何进行依赖注入,通过set方法把Dao注入到serves
|
5月前
|
Java Linux 程序员
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
技术笔记:Spring生态研习【五】:Springboot中bean的条件注入
|
5月前
|
SQL 安全 Java
Spring Boot中的跨站点脚本攻击(XSS)与SQL注入防护
【6月更文挑战第15天】在现代Web应用程序开发中,安全性是一个至关重要的课题。跨站点脚本攻击(XSS)和SQL注入是最常见的两种攻击类型,它们可以严重威胁到应用程序的安全。
574 0