`
gaoyuntao2005
  • 浏览: 312306 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Constructor注入

阅读更多

Spring鼓励的是setter injection,但也允许您使用constructor injection,使用setter或constructor来注入依赖关系视您的需求而定,这边先来看看如何使用construtor injection,首先看看HelloBean:

HelloBean.java

package onlyfun.caterpillar;

 

public class HelloBean {

    private String helloWord = "hello";

    private String user = "NoBody";

  

    public HelloBean(String helloWord, String user) {

        this.helloWord = helloWord;

        this.user = user;

    }  

  

    public String sayHelloToUser() {

        return helloWord + "!" + user + "!";

    }

}


 为了突显建构函式,我们这个HelloBean设计的简陋,只提供了建构函式与必要的sayHelloToUser(),我们来看看bean的定义档案:

bean.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">

        <constructor-arg index="0"><value>Greeting</value></constructor-arg>

        <constructor-arg index="1"><value>Justin</value></constructor-arg>

    </bean>

</beans>


 在bean的定义档案中,我们使用<constructor-arg>来表示我们将使用 constructor injection,由于使用constructor injection时并不如setter injection时拥有setXXX()这样易懂的名称,所以我们必须指定参数的位置索引,index属性就是用于指定我们的对象将注入至建构函式中的哪一个参数,索引值从0开始,符合Java索引的惯例。
 来看看测试程序:

Test.java

package onlyfun.caterpillar;

 

import java.io.*;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

 

public class Test {

    public static void main(String[] args) throws IOException {

        InputStream is = new FileInputStream("bean.xml");

        BeanFactory factory = new XmlBeanFactory(is);

      

        HelloBean hello = (HelloBean) factory.getBean("helloBean");

        System.out.println(hello.sayHelloToUser());

    }

}


 实际的执行结果如下:

2004/10/21 下午 03:53:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from resource for InputStream

2004/10/21 下午 03:54:02 org.springframework.beans.factory.support.AbstractBeanFactory getBean

信息: Creating shared instance of singleton bean 'helloBean'

2004/10/21 下午 03:54:03 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory autowireConstructor

信息: Bean 'helloBean' instantiated via constructor [public onlyfun.caterpillar.HelloBean(java.lang.String,java.lang.String)]

Greeting!Justin!


 要讨论使用constructor或setter来完成依赖注入这个问题,其实就等于在讨论一个古老的问题,要在对象建立时就准备好所有的资源,或是在对象建立好后,使用setter来进行设定。
 使用constructor的好处之一是,您可以在建构对象的同时一并完成依赖关系的建立,如果要建立的对象关系很多,使用 constructorinjection会在建构函式上留下一长串的参数,这时使用setter会是个不错的选择,另一方面, setter可以有明确的名称可以了解注入的对象会是什么,像是setXXX()这样的名称会比记忆constructor上某个参数位置代表某个对象来得好。
 然而使用setter由于提供了setXXX()方法,所以不能保证相关的field成员或资源在执行时期不会被更改设定,所以如果您想要让一些field成员或资源变为只读或是私有,使用constructor injection会是个简单的选择

分享到:
评论

相关推荐

    IntellijIDEA中MybatisMapper自动注入警告的6种解决方案.docx

    使用 constructor 注入,可以解决警告。这种方式是 Spring 官方推荐的方式,原因详见《Why field injection is evil》。 总结:这 6 种解决方案都是可以解决 IntellijIDEA 中 MybatisMapper 自动注入警告的方法,每...

    Spring中IOC和AOP的详细解释共1页.pdf.zi

    setter注入是通过setter方法将依赖注入到对象中,而constructor注入是在对象实例化时通过构造函数传入依赖。开发者可以根据需求选择合适的方式。 **面向切面编程(AOP)** AOP是一种编程范式,它允许程序员定义...

    Java In Spring

    IoC通过setter注入、constructor注入、interface注入和field注入等方式实现对象的装配。 Spring的面向切面编程(AOP)则是为了解决传统面向对象编程中出现的"紧耦合"问题,即业务逻辑与系统服务的过度纠缠。AOP的...

    Spring 应用框架技术面试题.doc

    - Constructor注入:通过构造函数传递依赖对象。 4. **Spring的核心类** - BeanFactory:作为Spring的基础容器,负责创建和管理Bean,可实现单例模式。 - BeanWrapper:提供对Bean属性的统一访问,简化get和set...

    Spring 应用框架技术.doc

    - Constructor注入:在构造函数中注入依赖。 4. **Spring核心类**: - BeanFactory:创建和管理Bean的工厂,支持单例模式。 - BeanWrapper:提供统一的访问Bean属性的方法。 - ApplicationContext:BeanFactory...

    java开发面试题100M文档

    - DI(依赖注入):setter注入,constructor注入,注解注入。 - Spring Boot和Spring Cloud:快速启动,自动配置,微服务架构。 这些知识点构成了Java开发面试题100M文档的主要内容,对于想要在Java领域寻求发展...

    spring精通

    Spring提供setter注入和constructor注入两种方式,使得对象之间的依赖关系更加清晰,降低耦合度。 4. **Spring Boot** - Spring Boot简化了Spring应用的初始搭建和配置工作,通过内置的Tomcat服务器和自动配置功能...

    Spring入门教程(清晰)

    Spring支持两种DI方式:setter注入和constructor注入,可以根据项目需求选择合适的方式。 四、Spring AOP AOP模块提供了声明式事务管理、日志记录等功能。通过定义切面和通知,可以在不修改原有代码的情况下,插入...

    Spring2.0(一)第一个Spring程序、IoC的应用

    Spring提供了多种注入方式,包括setter注入、constructor注入、接口注入等。 7. **组件扫描与自动装配**:在Spring 2.0中,可以通过组件扫描(Component Scanning)和自动装配(Auto Wiring)进一步简化配置。组件...

    spring源代码

    3. **依赖注入**: Spring通过setter方法、constructor注入和field注解实现依赖注入。在`org.springframework.beans.factory.annotation`包中,`AutowiredAnnotationBeanPostProcessor`处理@Autowired注解,自动查找...

    springPPT课件

    Spring提供了两种方式实现DI:setter注入和constructor注入。 2. **AOP(面向切面编程)**:Spring的AOP支持允许开发者定义方法拦截器和切入点,用于实现如日志记录、事务管理等横切关注点。这使得业务逻辑代码更...

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】

    - **依赖注入**:setter注入、constructor注入。 - **AOP**:切面编程,通知类型,自动代理。 - **事务管理**:编程式和声明式事务。 10. **数据库相关** - **JDBC**:连接数据库,执行SQL,处理结果集。 - **...

    J2EE应用开发详解

    254 15.3 依赖注入 259 15.3.1 Constructor注入 259 15.3.2 Setter注入 261 15.3.3 Method注入 263 15.4 Spring AOP技术 266 15.4.1 装备(advices) 267 15.4.2 Spring AOP的传统用法 275 15.4.3 基于@AspectJ注释...

    spring的注入方式

    Spring提供了多种注入方式,包括set注入、构造注入和自动注入,让我们逐一深入探讨。 1. **Set注入** Set注入是最常见的注入方式,它通过setter方法来设置对象的依赖。首先,你需要在类中声明需要注入的属性,并...

    Spring的注入方式详解

    下面我们将详细探讨Spring 中的三种注入方式:接口依赖注入(Type1)、setter/getter 注入(Type2,也称为属性注入)和构造方法注入(Type3)。 1. **接口依赖注入(Type1)** 这种注入方式相对不常见,主要适用于...

    spring的setter注入和构造注入(XML讲解以及常见错误)

    &lt;constructor-arg value="张三"/&gt; ``` 选择setter注入还是构造注入,通常取决于依赖是否可选以及对象创建的时机。setter注入适用于可选依赖,而构造注入适用于核心依赖。 在使用Spring的DI过程中,可能会遇到...

    c# 依赖注入 控制反转

    - **Constructor Injection(构造函数注入)**:通过对象的构造函数来注入依赖项,这种方式可以确保对象在创建时就已经具备所有必需的依赖项。 - **Setter Injection(设值注入)**:通过对象的setter方法来注入依赖...

    spring setter 和构造 注入 例子 spring 4.2.0

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。DI主要有两种实现方式:setter注入和构造器注入。 首先,我们来...

    Spring_Spring_教程8_注入_复杂类型的注入

    在XML配置中,可以使用`&lt;bean&gt;`标签的`class`属性指定类名,并通过`&lt;constructor-arg&gt;`或`&lt;property&gt;`标签注入依赖。在Java配置中,使用`@Component`注解标记类,然后使用`@Autowired`注解进行注入。 3. 接口实现的...

Global site tag (gtag.js) - Google Analytics