依赖注入


  依赖注入的原理与实现 依赖注入(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. IS-IS完整笔记

    IS-IS笔记大全 1.公开,ISO国际标准化组织(按照中文顺序翻译) 中间系统到中间系统 双栈.集成 数据传递机制 Cons面向连接网络服务(TCP) Clns缺少链接网络服务(UDP) Is-is ...

  2. 获取windows任务栏高度的方法

    方法一: TRect rt; SystemParametersInfo(SPI_GETWORKAREA, , &rt, ); //任务栏在下面的高度 int y = ::GetSystemMe ...

  3. Swing-JTable用法-入门

    注:本文为学习笔记,原文为How to Use Tables,本文所有素材与代码均源于原文,可能会有部分更改. JTable是Swing中的表格控件,它的外观如下所示: 没错,excel或者acces ...

  4. 201521123118《java程序与设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

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

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

  6. 201521123009 《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 Q1:互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问 ...

  7. 201521123090《Java程序设计》第12周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 书面作业 将Student对象(属性:int id, String name,int age,double grad ...

  8. thinkphp创建对象及数据操作

    ThinkPHP有三种创建控制器对象的方式: 通过命名空间的路径找到类然后new出来例如:$dx = new \Home\Controller\IndexController(); 通过A快捷函数创建 ...

  9. Java项目生成Jar文件

    打开 Jar 文件向导 Jar 文件向导可用于将项目导出为可运行的 jar 包. 打开向导的步骤为: 在 Package Explorer 中选择你要导出的项目内容.如果你要导出项目中所有的类和资源, ...

  10. Java多线程高并发学习笔记(三)——深入理解线程池

    线程池最核心的一个类:ThreadPoolExecutor. 看一下该类的构造器: public ThreadPoolExecutor(int paramInt1, int paramInt2, lo ...