Spring ——依赖注入配置一些知识点
依赖注入
依赖注入的原理与实现 依赖注入(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 ——依赖注入配置一些知识点的更多相关文章
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Spring依赖注入:注解注入总结
更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...
- Spring 依赖注入,在Main方法中取得Spring控制的实例
Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...
- Spring依赖注入 --- 简单使用说明
Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...
- spring依赖注入方法
依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给sprin ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- Spring依赖注入的三种方式
看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...
- Spring、Spring依赖注入与编码剖析Spring依赖注入的原理
Spring依赖注入 新建PersonIDao 和PersonDao底实现Save方法: public interface PersonIDao { public void save(); } pub ...
随机推荐
- 新CCIE笔记-路由器的配置
CCIE重修笔记之路由器基本配置与最简单的路由. 路由器与交换机的基本配置命令 全局配置模式下有多种子模式 (华为可以跳跃切换模式) 思科命令行技巧 Tab键补全,也可以直接保留缩写 问号'?'类似l ...
- Git和Github使用
什么是Git? Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问. 版本控制 简单地说,就是将在本地开发的代码,定时推送到服务器.每一次修改, ...
- 微信小程序xml解析
准备: 下载xmldom库:https://github.com/jindw/xmldom 将dom.js.dom-parser.js.sax.js,entities.js拷贝微信小程序需要的文件夹下 ...
- 201521123061 《Java程序设计》第十二周学习总结
201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...
- 201521123108 《Java程序设计》第2周学习总结
1. 本章学习总结 学习了java的知识,虽然还不是太懂,以后一定会取得进步的 2. 书面作业 Q1. 使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)? 答: Q2. 为什 ...
- Java课程设计—学生成绩管理系统(201521123005 杨雪莹)
一.团队课程设计博客链接 学生成绩管理系统 二.个人负责模块或任务说明 学生成绩录入 显示所有学生信息 显示各科平均成绩 显示学生成绩(按降序排序) 三.自己的代码提交记录截图 四.自己负责模块或任务 ...
- 201521123086 《Java程序设计》第9周学习总结
本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. (1)使用try...catch语句捕获异常(try块后可跟一个或多个catch块,注意子类异常要放在父类异常前面,否则子 ...
- 201521123014 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 Q1 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用sync ...
- python之异常
一.异常与错误 1.语法错误 错误一: if 错误二: def text: pass 错误三: print(sjds 2.逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num ...
- Dstl Satellite Imagery Feature Detection-Data Processing Tutorial
如何读取WKT格式文件 我们找到了这些有用的包: Python - shapely.loads() R - rgeos 如何读取geojson格式文件 我们找到了这些有用的包: Python - j ...