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会是个简单的选择
相关推荐
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注释...
·工厂方法如果需要参数,都使用constructor-arg属性确定参数值。 ·其他依赖注入属性,都使用property 元素确定参数值。 Person.java PersonFactory.java Chinese.java American.java bean.xml SpringTest.java
constructor ( { engine } ) { this . _engine = engine ; } } class Engine { } const { ContainerBuilder } = require ( 'di6' ) ; const builder = new ContainerBuilder ( ) ; // Give the `Engine` t
node.js依赖注入轻松扩展您的node.js应用。 npm i hekdi基本用法: // imported.module.jsconst { createModule } = require ( 'hekdi' ) ;class Dependency1 { constructor ( ) { this . name = 'Dependency1' ; }}...
ean的自动装配,有4种 (1)no:不做任何操作 (2)byName:根据属性 名 自动装配,设值注入 ...(4)constructor:与 byType 方式类似,不同之处是构造注入 <bean class="xxx" ></bean> 本例,演示 byName自动装配
角度注入用于角度相关性注入的角度装饰器。安装 $ npm install --save angular-inject用法 // ES2016 styleimport {inject} from 'angular-inject'// CommonJS stylelet inject = require('angular-inject').inject;...
参考Yii2实现的以依赖注入为基础的服务定位器,Yii2代码部分为vendor / yiisoft / yii2 / di /依赖注入DI依赖注入知道怎么初始化对象,只需配置构造参数就可以,核心代码如下(简化,只是说思路) class Di { //经过...
使用的标签:constructor-arg 标签出现的位置:bean标签的内部 标签中的属性: type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些数据的类型 index:用于指定要注入的数据 给构造函数中...
PhpCms2008 SP4 110121 更新内容: 1、删除构造函数,解决Redefining already defined constructor for class 问题 2、更新标签选择栏目,子栏目无法显示问题 3、admin/template.inc.php 写错单词 模板管理 BUG 4、...
独立于框架的单例注入容器,可应用于react vue 任何js 框架或项目中,实现多模块数据状态共享以及控制类的单例化,容器内只可以注入纯CLASS类 使用方式 1.VUE下写一个class控制类,并添加一个data属性作为共享状态,...
在注入内存马的过程当中,我们可能需要用到反射机制,例如注入一个servlet型的内存马,我们需要使用反射机制来获取当前的context,然后将恶意的servlet(wrapper)添加到当前的context的children中。 在使用Java反射...
注入装饰器简单的依赖注入器。开始吧npm install --save-dev inject-decorators用法let num = 1;let str = "abc";let bool = true;let symbol = Symbol();@Inject(num, str, bool, symbol)class Foo { constructor...
刚果依赖注射 概述 安装 > npm install conga-dependency-injection 用法 配置实例 var config = { // set up some parameters ... "constructor" : "%fs.service.constructor%" }, { "id" : "my.ser
使用ComponentFactoryResolver并将组件直接注入DOM主体 安装 npm安装ng-sppro-lightbox 用法 //import lightbox service into componennt import { LightboxService } from "ng-sppro-lightbox"; //Inject service ...
入口装饰规模化项目的依赖项注入的最小解决方案。为什么 :slightly_smiling_face:安装yarn add entrance-decorator用法定义入口import { entrance } from 'entrance-decorator' ;export class Entrances { ...
代码为打字稿生成的,类型强的依赖项注入。 为自己倒一杯甜美,甜蜜的依赖。 介绍 基于和的DI工具的启发,pitter旨在成为两种方法中的最佳方法:用于早期错误检查的代码生成,以及用于简单配置的约定的参数名称。 ...
Spring学习项目IOC依赖的jar包 aspect2 dbcp hibernate jdom junit4 mysql pool2 spring slf4j注入类型setter(重要)Setter-based dependency injection构造方法注入 Constructor-based dependency injectionbeans....
节点DI这是模块向您的代码添加DependencyInjection。 此功能还将为您添加插件...@ Injectable ( )class A { }@ Injectable ( )class B { constructor ( a : A ) { }}@ Injectable ( )class C { constructor ( b : B ,
角es6-di 更好的Angular 1.x依赖注入,支持服务,控制器,指令和值。安装jspm install angular-es6-di 需要启用了es7.decorators Traceur或Babel。用法ES6带来了具有继承支持的类。 最好在类中编写控制器和服务,并...
衔铁轻量级且极其容易扩展的依赖项注入框架使用实例var builder = new Builder(BuildStage.Cache, BuildStage.Create) { new AnyUnitSequenceMatcher { // inject into constructor new LastUnitSequenceMatcher...