依赖注入


  依赖注入的原理与实现 依赖注入(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. Jsp与beetl的比较

    首先介绍一下模板引擎的概念,是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎,就会生成一个标准的html文档. Jsp全名是JavaServer Page,中文名叫 ...

  2. 201521123061 《Java程序设计》第三周学习总结

    1. 本章学习总结 2. 书面作业 **Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2 ...

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

    ---恢复内容开始--- 1. 本周学习总结 2. 书面作业 1. 代码阅读 以上代码可否编译通过?哪里会出错?为什么?尝试改正?        如果创建3个Test1对象,有内存中有几个i,几个j? ...

  4. Cookie和Session总结

    Cookie概述     Cookie是什么?       Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递.Cookie包含每次用户访问站点时Web应用程序都可以读取 ...

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

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1. 在使用命令执行框时一定要记住大小写的区分: 2. 数据库中表的数据删除后id还是继续自增的,目前只会使用" ...

  6. Ajax跨域问题的出现和解决

    什么是跨域? 1).请求是执行过去了,但是响应的数据拿不到 2).浏览器有一个安全限制叫同源策略(针对ajax请求): 从http://localhost:80/member/apply.html页面 ...

  7. logback:用slf4j+logback实现多功能日志解决方案

    slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有了很大的提升 ...

  8. grep与正则表达式基础

    目录 grep 正则表达式 grep用法简介 我们介绍GREP的用法,主要用于匹配行,我们借助下面的正则表达式来介绍如何使用grep,还有就是正则表达式在linux中是极为重要的一部分. 命令:gre ...

  9. 纳税服务系统【抽取BaseService、条件查询】

    抽取BaseService 到目前为止,我们已经写了三个模块的开发了.我们已经抽取过了BaseAction.BaseDao,我们这次来看看我们的Service接口. UserService /** * ...

  10. MySQL的一点浅显知识

    本人最近看了一本有关于MySQL的书籍<MySQL必知必会>,书中只写了一些基本知识,但是也基本涵盖了所有的MySQL的知识点.其余的比较高级的也只是在基础上进行扩展或者是优化,看完这本书 ...