【Spring实战】—— 2 构造注入

本文讲解了构造注入以及spring的基本使用方式,通过一个杂技演员的例子,讲述了依赖注入属性或者对象的使用方法。

  如果想要使用spring来实现依赖注入,需要几个重要的步骤:

  1 定义主要的类和需要分离的属性。这里主要的类,是指程序的主要对象,在例子中是Juggler杂技员。而想要分离构造的属性,是它手中的袋子的数目beanBags。

  2 配置bean.xml。通过配置文件,确定主要的类和属性之间的关系,以及实现类。

  3 通过应用上下文,获取bean,并进行使用。

  简单的注入例子,一个表演者仍袋子的故事。

  实例代码:

  1 表演者接口:Performer.java

package com.spring.test.action1;

public interface Performer {
    void perform() throws PerformanceException;
}

  2 杂技员:Juggler,继承了表演者接口

package com.spring.test.action1;

public class Juggler implements Performer{
    private int beanBags = 3;

    public Juggler(){

    }

    public Juggler(int beanBags){
        this.beanBags = beanBags;
    }

    public void perform() throws PerformanceException {
        System.out.println("Juggler "+beanBags+" beanBags");
    }

}

  3 Spring配置文件:bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     <bean id="duke" class="com.spring.test.action1.Juggler">
         <constructor-arg value="15"/>
     </bean>
</beans>

  4 应用上下文获取指定的bean

package com.spring.test.action1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
        Performer performer = (Performer)ctx.getBean("duke");
        try {
            performer.perform();
        } catch (PerformanceException e) {
            e.printStackTrace();
        }
    }
}

  执行结果如下:

Juggler 15 beanBags

  当主要的类中依赖注入的不是属性,而是对象。

  1 例如,上面的杂技演员不仅仅会仍袋子,还会表演诗歌,那么诗歌这个对象就需要注入到表演者的构造函数中,可以如下表示会朗诵诗歌的杂技演员:PoeticJuggler

package com.spring.test.action1;

public class PoeticJuggler extends Juggler{
    private Poem poem;

    public PoeticJuggler(Poem poem){
        super();
        this.poem = poem;
    }

    public PoeticJuggler(int beanBags,Poem poem){
        super(beanBags);
        this.poem = poem;
    }

    public void perform() throws PerformanceException {
        super.perform();
        System.out.println("While reciting...");
        poem.recite();
    }

}

  2 诗歌对象:Sonnet29

package com.spring.test.action1;

public class Sonnet29 implements Poem{
    private static String lines = "嘛咪嘛咪哄";

    public Sonnet29() {

    }

    public void recite() {
        System.out.println(lines);
    }

}

  3 Bean.xml配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     <bean id="duke" class="com.spring.test.action1.Juggler">
         <constructor-arg value="15"/>
     </bean>
     <bean id="sonnet29" class="com.spring.test.action1.Sonnet29"/>
     <bean id="poeticDuke" class="com.spring.test.action1.PoeticJuggler">
         <constructor-arg value="15"/>
         <constructor-arg ref="sonnet29"/>
     </bean>
</beans>

  4 主要的执行代码,通过应用上下文获取制定的bean

package com.spring.test.action1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
//        Performer performer = (Performer)ctx.getBean("duke");
        Performer performer1 = (Performer)ctx.getBean("poeticDuke");
        try {
//            performer.perform();
            performer1.perform();
        } catch (PerformanceException e) {
            e.printStackTrace();
        }
    }
}

  5 执行结果如下

一月 24, 2015 4:40:46 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org[email protected]35bf8de1: startup date [Sat Jan 24 16:40:46 CST 2015]; root of context hierarchy
一月 24, 2015 4:40:46 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [bean.xml]
一月 24, 2015 4:40:46 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.s[email protected]3401a0ad: defining beans [duke,sonnet29,poeticDuke]; root of factory hierarchy
Juggler 15 beanBags
While reciting...
嘛咪嘛咪哄
时间: 2024-10-23 00:01:55

【Spring实战】—— 2 构造注入的相关文章

[Spring实战系列](8)Spring注入方式之setter注入

通常,JavaBean 的属性是私有的,同时拥有一组存取器方法,以setXXX() 和getXXX() 形式存在.Spring 可以借助属性的set方法来配置属性的值,以实现setter方式的注入. 1. 注入简单值 在Spring 中我们可以使用<property> 元素配置Bean 的属性.<property>在许多方面都与<constructor-arg> 类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的setter 方法来注入值. 举例说明,让我们

Spring 构造注入 传参数

1.        提供对应的构造方法 //构造器注入 public class Bean6 { private String name; private Integer age; // 服务于构造器注入使用 public Bean6(String name, Integer age) { super(); this.name = name; this.age = age; } public void show() { System.out.println("bean6:" + nam

Spring注入值得2种方式:属性注入和构造注入

Spring是一个依赖注入(控制反转)的框架,那么依赖注入(标控制反转)表现在那些地方了? 即:一个类中的属性(其他对象)不再需要手动new或者通过工厂方法进行创建,而是Spring容器在属性被使用的时候给予注入. 注入有2种方式: 1. 属性注入:通过无参构造函数+setter方法注入 2. 构造注入:通过有参的构造函数注入. 优缺点: 1. 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿. 2. 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值

spring构造注入

Sping 结构体系结构4个核心组件 Beans:Bean是包装我们应用程序自定义对象Object的bject存有数据. Core: context在发现建立,维护Bean之间关系所需的一些工具.如资源的加载,资源的抽象等. Context:context就是一个Bean关系的集合. Expression : spring表达式语言. 构造注入: 前提的有构造 //学生类 public class Student {    @Override    public String toString(

Spring接口编程_设值注入和构造注入

说明: UserManagerImp是设值注入,UserManagerImp2是构造注入 接口不注入,也就是在Spring配置文件中没有接口的<bean>,但是定义的时候是用接口 private IUserDao userDao; IUserManager userManager2=(IUserManager) factory.getBean("userManager2"); 类都注入,①UserManagerImp和UserManagerImp2属于实现类 ②UserDa

7.28.1 Spring构造注入还是设置注入

1. 构造方法注入代码如下:public UserManagerImpl(UserDao userDao) {                                                  this.userDao = userDao;                                    } set注入代码如下:        public void setUserDao(UserDao userDao) {                         

Spring常用的jar+普通构造注入

常用工具 jar 说明 提供AOP(面向切面编程)实现:spring -aop spring提供对AspectJ框架的整合:spring-aspects 提供 IoC(控制反转)的基础实现:spring-beans spring提供在 IoC 基础功能上的扩展服务:spring-context 对spring-context的扩展支持:spring-context-support spring核心组件:spring-core spring表达式语言:spring-expression sprin

Spring框架-构造注入的属性问题-type属性

还是使用上面一个小demo,进行测试,验证一个问题,废话不多说了,上代码进行比较 1 package service.impl; 2 3 import service.UserService; 4 import dao.UserDao; 5 import entity.User; 6 7 /** 8 * 用户业务类,实现对User功能的业务管理 9 */ 10 public class UserServiceImpl implements UserService { 11 12 // 声明接口类

Spring(3.2.3) - Beans(2): 属性注入 &amp; 构造注入

依赖注入是指程序运行过程中们如果需要另外的对象协作(访问它的属性或调用它的方法)时,无须在代码中创建被调用者,而是依赖于外部容器的注入. 属性注入(Setter Injection) 属性注入是指 IoC 容器使用 Bean 属性的 setter 方法来注入 Bean 依赖的实例.使用属性注入应该为 Bean 提供一个无参的构造函数和属性的 setter 方法. <bean id="magicWand" class="com.huey.dream.bean.Weapon