依赖注入


  依赖注入的原理与实现 依赖注入(DI)和依赖查找(Dependency Lookup)共同组成 控制反转(IoC)。从原理的角度来说,依赖注入和控制反转是没 有不同的,可以看作是从两个角度来阐述一个概念,即基于 Spring 的架构系统中,在一个对象(调用者)为另一个对象(被调用者) 协助工作(调用)时,不用创建,该调用由 Spring 的 Bean 完成, 也就是控制反转。

  依赖注入是使用 Reflection 实现的,在 Java 1.3 以后,有一个 重要特性是 Reflection 可以当执行系统的时候,进行动态的创建、 运行和修改实例,依赖注入不仅可以在容器中注入一般属性值,也能将其他引 用注入。

  依赖注入起到的作用就是讲对象之间的依赖关系从原先的代码中解耦出来,通过配置文件或注解等方式加上Spring框架的处理让我们对依赖关系灵活集中的进行管理。

借网上一张图一用就明白为什么松耦合了

在我看来就是把东西都放在了配置文件,一些关系都在配置文件给你配好了,只管调用,这是肤浅的理解,底层的是反射的机制

先看一下XML是怎么配置的吧!

构造方法注入


简单一些的注入

<bean id="user"   class="com.spring.bean.User">
<!--使用构造方法注入 -->
<constructor-arg>
<value>1</value>
</constructor-arg>
<constructor-arg>
<value>admin</value>
</constructor-arg>
<constructor-arg>
<value>123456</value>
</constructor-arg>
</bean>

构造参数值设置有很多方式:

<!-- 按类型设置-->
<constructor-arg type="java.lang.String" value="Jack"/>
<!-- 按顺序设置-->
<constructor-arg index="1" value="Jack"/>
<!-- 按属性名设置-->
<constructor-arg name="username" value="Jack"/>

可以引申出来一些其他的

<bean name="UserDao" class="com.zejian.spring.impl.UserDaoImpl"/>
<!-- 通过构造注入依赖 -->
<bean name="UserService" class="com.zejian.spring.service.impl.UserServiceImpl">
<!-- 构造方法方式注入UserDao对象,-->
<constructor-arg ref="UserDao"/>
</bean>

在你的业务实现类中

/**
*
* @author 坚持到你GL
*
*/
public class UserServiceImpl implements UserService{
//需要注入的对象Dao
private UserDao userDao;
//通过构造注入得到
public UserServiceImpl(UserDao userDao){
//将传过来的值设置到自己的属性中去
this.userDao=userDao;
} }

bean中各种属性注入方式


正常属性

    <!--属性注入  -->
<bean id="info" class="com.spring.bean.Info">
<property name="id" value="1"/>
<property name="adress" value="浙江" />
</bean>

数组类型

        <!--配置数组类型  -->
<property name="arr" >
<array>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</array>
</property>

list类型

  <!--配置list类型  -->
<property name="week">
<list>
<value>周一</value>
<value>周二</value>
<value>周三</value>
</list>
</property>

map类型

    <!--配置map类型  -->
<property name="infos">
<map>
<entry key="name" value="admin"></entry>
<entry key="age" value="23"></entry>
</map>
</property>

set类型

   <!--配置set类型  -->
<property name="word">
<set>
<value>hello</value>
<value>world</value>
<value>hi</value>
</set>
</property>

还要一个小知识点

properties文件的读取

   <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="location" value="jdbc.properties"/>
</bean>

实例化的三种方式


其实也没啥就是三种不同方式创建实例

先看一下三个Java文件

package com.spring.factory;
import com.spring.action.HelloWorldImpl;
/**
*
* @author 坚持到你GL
*
*/
public class HelloFactory {
public static HelloWorldImpl createHello() {
return new HelloWorldImpl();
}
}
package com.spring.factory;
import com.spring.action.HelloWorldImpl;
/**
*
* @author 坚持到你GL
*
*/
public class WorldFactory {
public HelloWorldImpl createWorld() {
return new HelloWorldImpl();
}
}
package com.spring.action;
/**
*
* @author 坚持到你GL
*
*/
public class HelloWorldImpl implements HelloWorld{
@Override
public String sayHi() {
// TODO Auto-generated method stub
return "实例化-----Hello World!!!";
}
}

再看一下配置文件xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 构造器实例化 -->
<bean id="helloworld" class="com.spring.action.HelloWorldImpl" ></bean>
<!-- 静态工厂实例化 -->
<bean id="staticworld" class="com.spring.factory.HelloFactory" factory-method="createHello"></bean>
<!-- 实例化工厂实例 -->
<bean id="world" class="com.spring.factory.WorldFactory" ></bean>
<bean id="worlds" factory-bean="world" factory-method="createWorld"></bean>
</beans>

测试代码:

package com.spring.action;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* @author 坚持到你GL
*
*/
public class Mytest {
public static void main(String[] args ) {
ApplicationContext ac=new ClassPathXmlApplicationContext("springXML/app.xml");
//构造器实例化
HelloWorld world=(HelloWorld)ac.getBean("helloworld");
System.out.println(world.sayHi());
//静态工厂实例化
HelloWorld hWorld=(HelloWorld)ac.getBean("staticworld");
System.out.println(hWorld.sayHi()+"----");
//实例工厂
HelloWorld hello=(HelloWorld)ac.getBean("worlds");
System.out.println(hello.sayHi()+"***");
}
}

可能一起给出来不咋好,但是认真看就会看出一点门道

【版本声明】本文为博主原创文章,转载请注明出处

Spring ——依赖注入配置一些知识点的更多相关文章

  1. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  2. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  3. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  4. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  5. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  6. spring依赖注入方法

    依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给sprin ...

  7. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  8. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  9. Spring、Spring依赖注入与编码剖析Spring依赖注入的原理

    Spring依赖注入 新建PersonIDao 和PersonDao底实现Save方法: public interface PersonIDao { public void save(); } pub ...

随机推荐

  1. 结对作业1--基于GUI的四则运算

    201421123002 翁珊,201421123006 黄月梅,201421123007 徐晓珊 题目描述: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程 ...

  2. mysql外键设置选项

    . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 . set null方式 在父表上update/delete记录时,将子表上匹配记录的 ...

  3. 201521123100 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1.接口不是类,不能使用new进行实例化 2.使用instanceof运算符,可 ...

  4. 201521123090《JAVA程序设计》第二周学习总结

    1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...

  5. Python[小甲鱼005Python的数据类型]

    一.数值类型 整形 布尔类型        True 和 False  即1和0 浮点型 e记法                e ,例如      1.5e11 = 150000000000     ...

  6. 201521123066 《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 有关异常的知识点: 一段代码可能生成多种类型的异常,子类异常必须放在父类异常前面,否则会出现编译错误: 可以 ...

  7. 【干货篇】步步为营,带你轻松掌握jQuery!

    写在前面:经过系统的学习了原生JS之后,会发现其具有以下三个特点: 1.是一种解释性脚本语言(代码不进行预编译). 2.主要用来向 HTML 页面添加交互行为. 3.可以直接嵌入 HTML 页面,但写 ...

  8. [js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

    一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的 ...

  9. Mybatis第九篇【基于Maven在Idea下Mybatis逆向工程】

    前言 在Intellij idea下,没有学习Maven的情况下使用Mybatis的逆向工程好像有点复杂,资料太少了-找到的资料好像也行不通- 于是学完Maven之后,我就再来更新Idea下使用Myb ...

  10. OC——继承

    继承的其中一个很重要的目的是为了实现多态.我们现在先来看看OC的继承. 一.继承 父类: 头文件 // // Peason.h // 01-继承和多态 // // Created by zhangji ...