Spring的DI(Ioc) - 注入bean 和 基本数据类型
注入bean有两种方式:
- 注入其他bean:
- 方式一
- <bean id="orderDao" class="cn.itcast.service.OrderDaoBean"/>
- <bean id="orderService" class="cn.itcast.service.OrderServiceBean">
- <property name="orderDao" ref="orderDao"/>
- </bean>
- 方式二(使用内部bean,但该bean不能被其他bean使用)
- <bean id="orderService" class="cn.itcast.service.OrderServiceBean">
- <property name="orderDao">
- <bean class="cn.itcast.service.OrderDaoBean"/>
- </property>
- </bean>
一般我们的工程在service层依赖dao层的实现来实现业务逻辑。
service层:
- public class PersonServiceImpl implements PersonService {
- private PersonDao personDao;
- @Override
- public void save() {
- personDao.save();
- System.out.println("service : " + " save 方法");
- }
- public PersonDao getPersonDao() {
- return personDao;
- }
- public void setPersonDao(PersonDao personDao) {
- this.personDao = personDao;
- }
- }
dao层:
- public class PersonDaoImpl implements PersonDao {
- @Override
- public void save() {
- System.out.println("dao层的save方法");
- }
- }
beans.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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <bean id="personDaoImpl" class="cn.gbx.dao.PersonDaoImpl"></bean>
- <bean id="personServiceImpl" class="cn.gbx.serviceimpl.PersonServiceImpl" >
- <property name="personDao" ref="personDaoImpl"></property>
- </bean>
- </beans>
测试方法:
- public class SpringTest {
- @Test
- public void spring1() {
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
- PersonService ps = (PersonService)ctx.getBean("personServiceImpl");
- ps.save();
- }
- }
然后我们就实现了Spring对bean对象的依赖注入。 service层所依赖的dao层的PersonDao对象不是由service本身去创建管理,而是交给了第三方容器Spring去管理。
那么Spring是如何管理的呢?
我们可想而知
1: 首先必须解析XML 将 <bean>标签和 <property>标签都解析出来
2: 利用反射实例话对象
3: 利用内省将实例化完成的对象注入到有依赖的对象里面
我们可以自己模拟实现:
- package cn.gbx.myExample;
- import java.beans.BeanInfo;
- import java.beans.IntrospectionException;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Method;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.beanutils.ConvertUtils;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.Element;
- import org.dom4j.XPath;
- import org.dom4j.io.SAXReader;
- public class MyClassPathXmlApplicationContext {
- private List<DefBean> defBeans = new ArrayList<DefBean>(); //存储<bean>标签的信息
- private Map<String, Object> singltons = new HashMap<String, Object>(); //存储读出来的对象
- public MyClassPathXmlApplicationContext() {
- super();
- }
- public MyClassPathXmlApplicationContext(String filename) {
- this.readXML(filename);
- this.instanceBean();
- this.injectProperty();
- }
- //利用内省将属性注入
- private void injectProperty() {
- for (DefBean defBean : defBeans) {
- Object bean = singltons.get(defBean.getId());
- if (bean != null) {
- //要想将依赖的对象注入,我们就要通过内省来操作对象的属性
- try {
- BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
- PropertyDescriptor[] ps = beanInfo.getPropertyDescriptors();
- for (DefProperty p : defBean.getDefPropertys()) {
- for (PropertyDescriptor propertyDes : ps) {
- if (propertyDes.getName().equals(p.getName())) {
- Method setter = propertyDes.getWriteMethod();
- if (setter != null) {
- Object value = null;
- if (p.getRef() != null && !"".equals(p.getRef())) {
- value = singltons.get(p.getRef());
- } else { //基本数据类型利用beanUtils实现转化
- value = ConvertUtils.convert(p.getValue(),propertyDes.getPropertyType());
- }
- setter.setAccessible(true); //这样即使set方法是私有的都可以访问
- setter.invoke(bean, value); //把引用对象注入到bean属性里面
- }
- break;
- }
- }
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- //利用反射实例化对象
- private void instanceBean() {
- for (DefBean bean : defBeans) {
- //输出测试读取的xml
- /*System.out.println(bean.getId() + " : " + bean.getClassName());
- System.out.println("------------------------");
- for (DefProperty p : bean.getDefPropertys()) {
- System.out.println("Property : name = " + p.getName() + " : ref = " + p.getRef());
- }
- */
- if (bean.getClassName() != null && !"".equals(bean.getClassName())) {
- try {
- singltons.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
- private void readXML(String filename) {
- SAXReader reader = new SAXReader();
- Document document = null;
- URL xmlPath = this.getClass().getClassLoader().getResource(filename);
- try {
- document = reader.read(xmlPath);
- //创建命名空间
- Map<String, String> nsMap = new HashMap<String, String>();
- nsMap.put("ns", "http://www.springframework.org/schema/beans");
- //创建查询路径
- XPath xsub = document.createXPath("//ns:beans/ns:bean");
- xsub.setNamespaceURIs(nsMap); // 设置命名空间
- List<Element> elements = xsub.selectNodes(document);
- DefBean defBean = null;
- for (Element e : elements) {
- String id = e.attributeValue("id");
- String className = e.attributeValue("class");
- defBean = new DefBean(id, className);
- //为<bean>节点设置查询路径
- XPath xPropertySub = e.createXPath("ns:property");
- xPropertySub.setNamespaceURIs(nsMap);
- List<Element> propertys = xPropertySub.selectNodes(e);
- DefProperty defProperty = null;
- for (Element e2 : propertys) {
- String name = e2.attributeValue("name");
- String ref = e2.attributeValue("ref");
- String value = e2.attributeValue("value");
- defProperty = new DefProperty(name, ref, value);
- defBean.getDefPropertys().add(defProperty);
- }
- defBeans.add(defBean);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public Object getBean(String key) {
- return singltons.get(key);
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <bean id="personDaoImpl" class="cn.gbx.dao.PersonDaoImpl"></bean>
- <bean id="personServiceImpl" class="cn.gbx.serviceimpl.PersonServiceImpl" >
- <property name="personDao" ref="personDaoImpl"></property>
- <property name="name" value="ok-gbx"></property>
- <property name="id" value="22"></property>
- </bean>
- </beans>
Spring的DI(Ioc) - 注入bean 和 基本数据类型的更多相关文章
- Spring的DI(Ioc) - 注入集合类型
1: 首先给service添加集合类型的属性,并提供getter, setter package cn.gbx.serviceimpl; import java.util.ArrayList; imp ...
- [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired
Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring源码-IOC部分-Bean实例化过程【5】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- spring的DI.IoC是什么
最近要搞spring的单元测试,不得已啊啊啊啊啊啊啊啊啊又要开始搞spring…… 日目晶…… 搞这几个概念,先甩一部分代码: UserDao 接口 package com.itheima.ioc; ...
- 3、Spring的DI依赖注入
一.DI介绍 1.DI介绍 依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入. Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为&qu ...
- Spring框架(2)---IOC装配Bean(xml配置方式)
IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...
- Spring的几种注入bean的方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的se ...
- Spring(三)之Ioc、Bean、Scope讲解
Spring容器是Spring Framework的核心.容器将创建对象,将它们连接在一起,配置它们,并管理从创建到销毁的整个生命周期.Spring容器使用DI来管理组成应用程序的组件.这些对象称为S ...
随机推荐
- split function of Perl,Python,Awk
使用中常用到Perl,Python,AWK,R, 虽然Java,C,C++,Vala也学过但是就是不喜欢,你说怎么办. 看来一辈子脚本的命. Perl @rray = split /PATTERN/, ...
- php const define 区别有那些呢?
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- ECshop中defined('IN_ECS')的实现原理
在PHP中经常看到如下代码 if (!defined('IN_ECS')) { die('Hacking attempt'); } 实现的原因以及原理如下: ecs ...
- java 1G大文件复制
对比几种复制方法 复制的文件是980m的txt文件 1. FileChannel 方法 代码: public static void mappedBuffer() throws IOExceptio ...
- 怎么查看jar包版本
jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录 ...
- Reflector8.5 .net反编译工具 破解教程
一.断网 二.打开软件.打开注册机 三. 四. 五. 六. 七. 八.
- JAVA基础知识之JVM-——反射和泛型
泛型和Class类 在反射中使用泛型Class<T>可以避免强制类型转换,下面是一个简单例子,如果不使用泛型的话,需要显示转换, package aop; import java.util ...
- oracle 导出导入常见问题
oracle 导入导出常见有两种方法 EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户 ...
- java实现UDP协议传输DatagramSocket
摘自:http://blog.csdn.net/wintys/article/details/3525643/ Server端. package com.topca.server; import ja ...
- IOSanimationDidStop
-animationDidStop:finished: 方法中的flag参数表明了动画是自然结束还是被打断,我们可以在控制台打印出来.如果你用停止按钮来终止动画,它会打印NO,如果允许它完成,它会打印 ...