Spring XML 注入

  • DI:
    • 依赖注入:
      • 注入数据的方式:
        • setter方式注入:
          • 1.单值注入
          • 2.对象注入
          • 3.集合注入(直接注入和间接注入)
          • 4.属性注入(把属性文件中的数据注入给对象中)
          • 5.空值注入
        • 构造方式注入:
        • autowire 自动装配

DI:

依赖注入:

从Spring 容器中取出对象,注入到需要的地方。

根据所需要了解的注入方式创建下方的类。

创建UserServiceImpl类

package com.arno.service.impl;import com.arno.dao.UserDao;
import com.arno.entity.User;
import com.arno.service.UserService;public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao){this.userDao=userDao;}@Overridepublic boolean addUser(User user) {System.out.println("UserSerivceImpl.addUser()");userDao.addUser(user);return false;}@Overridepublic boolean updateUser(User user) {System.out.println("UserSerivceImpl.updateUser()");userDao.updateUser(user);return false;}}

创建UserDaoImpl类

package com.arno.dao.impl;import com.arno.dao.UserDao;
import com.arno.entity.User;public class UserDaoImpl implements UserDao {private String driverClass;private int port;private String dbUserName;private String dbPassword;public void setDriverClass(String driverClass) {this.driverClass = driverClass;}public void setPort(int port) {this.port = port;}public void setDbUserName(String dbUserName) {this.dbUserName = dbUserName;}public void setDbPassword(String dbPassword) {this.dbPassword = dbPassword;}@Overridepublic int addUser(User user) {System.out.println("UserDaoImpl.adduser()");System.out.println(driverClass+"   "+port+"   "+dbUserName+"   "+dbPassword);return 0;}@Overridepublic int updateUser(User user) {System.out.println("UserDaoImpl.updateuser()");return 0;}}

创建Message类

package com.arno.collection;import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;public class Message {private List list;private Set set;private Map map;private Properties props;public List getList() {return list;}public void setList(List list) {this.list = list;}public Set getSet() {return set;}public void setSet(Set set) {this.set = set;}public Map getMap() {return map;}public void setMap(Map map) {this.map = map;}public Properties getProps() {return props;}public void setProps(Properties props) {this.props = props;}@Overridepublic String toString() {return "Message [list=" + list + ", set=" + set + ", map=" + map + ", props=" + props + "]";}}

注入数据的方式:

setter方式注入:

1.单值注入

在xml中创建UserDaoImpl 对象,并且注入4个属性值

<!-- 告知spring创建 UserDaoImpl对象        对象名:userDao此对象中注入4个数据property节点对应一个set方法name="driverClass"  driverClass->DriverClass->setDriverClasssetDriverClass字符串去UserDaoImpl类中匹配setDriverClass的方法value="com.mysql.jdbc.Driver"--><bean id="userDao"  class="com.arno.dao.impl.UserDaoImpl"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="port" value="3306"></property><property name="dbUserName" value="root"></property><property name="dbPassword" value="root"></property></bean>
2.对象注入

在xml中创建UserDaoImpl 对象,注入4个属性值,对象命名为userDao,注入下方名为userService的对象中

     <!-- 告知spring创建 UserDaoImpl对象        对象名:userDao--><bean id="userDao"  class="com.arno.dao.impl.UserDaoImpl"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="port" value="3306"></property><property name="dbUserName" value="root"></property><property name="dbPassword" value="root"></property></bean><!-- 告知spring创建 UserServiceImpl对象  对象名:userServiceuserService对象中需要UserDaoImpl类的对象或userService对象中需要UserDao接口的对象proerty属性节点,每一个property节点都会对应一个setter方法name="userDao" userDao->UserDao->setUserDao拿setUserDao这个字符串作为方法的名称去UserServiceImpl类中寻找是否有setUserDao的方法如果有就反射调用setUserDao方法,方法的参数就是ref="userDao"ref="userDao"  ref:reference引用    userDao 是spring容器中的一个对象名称--><bean id="userService" class="com.arno.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean>
3.集合注入(直接注入和间接注入)

直接注入,创建Message对象,通过标签直接注入属性值

 <!-- 直接集合注入 --><bean id="message1" class="com.arno.collection.Message"><property name="list"><list><value>北京</value><value>上海</value><value>广州</value><ref bean="hello"></ref></list></property><property name="set"><set><value>北京</value><value>上海</value><value>广州</value><ref bean="hello"></ref></set></property><property name="map"><map><entry key="bj" value="北京"></entry><entry key="sh" value="上海"></entry><entry key="gz" value="广州"></entry></map></property><property name="props"><props><prop key="bj">北京</prop><prop key="sh">上海</prop><prop key="gz">广州</prop></props></property></bean>

间接注入,创建Hello对象和集合。创建Message对象,通过标签引用hello对象和集合注入到Message对象的属性中

 <!-- 间接集合注入 --><bean id="hello" class="com.arno.ioc.Hello"></bean><util:list id="ulist"><value>北京</value><value>上海</value><value>广州</value><ref bean="hello"></ref></util:list><util:set id="uset"><value>北京</value><value>上海</value><value>广州</value><ref bean="hello"></ref></util:set><util:map id="umap"><entry key="bj" value="北京"></entry><entry key="sh" value="上海"></entry><entry key="gz" value="广州"></entry><entry key="hello" value-ref="hello"></entry></util:map><util:properties id="uprops"><prop key="bj">北京</prop><prop key="sh">上海</prop><prop key="gz">广州</prop></util:properties><bean id="message2" class="com.arno.collection.Message"><property name="list" ref="ulist"></property><property name="set" ref="uset"></property><property name="map" ref="umap"></property><property name="props" ref="uprops"></property></bean>
4.属性注入(把属性文件中的数据注入给对象中)

${}方式:
创建mysql.properties文件(注意规避关键词)

 jdbc_driverClass=com.mysql.jdbc.Driverjdbc_url=jdbc:mysql://localhost:3306/tesdbjdbc_userName=rootjdbc_userPassword=root

创建jdbcUtil1和jdbcUtil2类

public class JDBCUtil1 {private String driverClass;private String url;private String userName;private String userPassword;getter and setter(生成get/set方法)}

通过${}方式取得mysql.properties内容并注入到jdbcUtil1对象中

 <!-- 用spring把属性文件的内容加载到spring容器中 ,多个属性文件用逗号间隔--><context:property-placeholder location="classpath:conf/mysql.properties"/><bean id="jdbcUtil1" class="com.arno.properties.JDBCUtil1"><property name="driverClass" value="${jdbc_driverClass}"></property><property name="url" value="${jdbc_url}"></property><property name="userName" value="${jdbc_userName}"></property><property name="userPassword" value="${jdbc_userPassword}"></property></bean>

#{}方式:
通过#{}方式取得mysql.properties内容并注入到jdbcUtil1对象中

 <!-- 用spring把属性文件的内容加载到spring容器中 ,多个属性文件用逗号间隔--><util:properties id="manyProperties"location="classpath:conf/mysql.properties"></util:properties><bean id="jdbcUtil2" class="com.arno.properties.JDBCUtil2"><property name="driverClass" value="#{manyProperties.jdbc_driverClass}"></property><property name="url" value="#{manyProperties.jdbc_url}"></property><property name="userName" value="#{manyProperties.jdbc_userName}"></property><property name="userPassword" value="#{manyProperties.jdbc_userPassword}"></property></bean>
5.空值注入

空值两种:"" 空字符串和null 空指针

创建Kong类

package com.arno.kong;public class Kong {private String str1;private String str2;public String getStr1() {return str1;}public void setStr1(String str1) {this.str1 = str1;}public String getStr2() {return str2;}public void setStr2(String str2) {this.str2 = str2;}}

创建Kong对象,注入“”和null

     <!--str1存储的是空字符串 ,str2存储的null--><bean id="kong" class="com.arno.kong.Kong"><property name="str1" value=""></property><property name="str2"><null /></property></bean>

上面的五种方式用setter方式把数据注入到需要的对象中

构造方式注入:

用构造方法注入数据:
创建Hello对象和ConstructorClass对象,并通过ConstructorClass构造方法注入Hello对象和属性值

        <bean id="hello" class="com.arno.ioc.Hello"></bean><bean id="constructorClass" class="com.arno.constructor.ConstructorClass"><constructor-arg index="0" value="张三"></constructor-arg><constructor-arg index="1" value="20"></constructor-arg><constructor-arg index="2" ref="hello"></constructor-arg></bean>

创建ConstructorClass类,并创建构造方法

ConstructorClass.javapublic class ConstructorClass {private String name;private String  age;private Hello hello;public ConstructorClass(String name, String age, Hello hello) {this.name = name;this.age = age;this.hello = hello;}public String getName() {return name;}public String getAge() {return age;}public Hello getHello() {return hello;}}

总结:在开发中用setter方法是最多,也最常用,灵活也最好

在开发中构造注入不常用,构造注入数据一般用在框架中居多

autowire 自动装配

byType 根据类型注入,
创建User对象,根据User对象中需要注入的属性,在spring容器中寻找是否有对应类型的对象,如果有就注入
前提:在spring容器中对应的类类型不能两个及以上

 <bean id="user" class="com.arno.autowire.User"autowire="byType"></bean>

byName根据名字注入,例如User中有Dog类需要注入,并且User类中有setDog()方法,根据setDog方法名,去掉set并首字母小写得到名字dog,在spring容器中寻找是否有对应名字的对象,然后通过set方法进行注入。

<!-- autowire="byName"  按照名称自动装配过程:首先搜索User类,类种需要两个对象,分别是Cat类和Dog类且类中有setCat方法,setCat->Cat->cat,拿cat去spring容器中寻找是否有此对象--><bean id="user" class="com.arno.autowire.User"autowire="byName"></bean>

Spring XML 注入相关推荐

  1. Spring xml 注入静态变量

    2019独角兽企业重金招聘Python工程师标准>>> 上代码 <bean id="cacheJsonRedisSerializer" class=&quo ...

  2. spring项目属性注入和bean管理xml 注入一般属性和集合属性

    IOC 介绍: 在Spring的应用中,Spring IoC容器可以创建.装配和配置应用组件对象,这里的组件对象称为Bean. Bean的实例化 在面向对象编程中,想使用某个对象时,需要事先实例化该对 ...

  3. springMVC通过spring.xml对属性注入bean值(工厂模式)

    springMVC通过spring.xml对属性注入bean值,该bean是一个map容器: <bean id="configXMLCreatorFactory" class ...

  4. spring基础Bean管理基于xml注入

    1.基于xml注入属性 1.什么是Bean管理 Bean管理指的是两个操作 (1) Spring创建对象 (2) Spirng注入属性 2.Bean管理操作有两种方式 (1)基于xml配置文件方式实现 ...

  5. spring依赖注入底层原理与源码分析

    Spring中有几种依赖注入方式? 1.手动注入-set方法注入和构造器注入 2.自动注入-@Autowired注解和xml注入 autowrire参数: no 默认不开启 byName 根据被注入属 ...

  6. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  7. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  8. spring 依赖注入

    Technorati 标记: spring,依赖注入,DI,ioc 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的 ...

  9. spring aop 注入源码解析

    spring aop 注入源码解析 aop启动 AbstractApplicationContext.java @Overridepublic void refresh() throws BeansE ...

  10. java接口注入对象的意义_Java Web系列:Spring依赖注入基础

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

最新文章

  1. python解包裹_关于Python中包裹传参和解包裹的理解
  2. http协议常见的响应头
  3. java多线程实现电梯_面对对象第二单元总结 - 电梯(java多线程)
  4. 在ubuntn kylin系统eclipse中Java语言helloworld程序
  5. 从注册表清理 IE10,IE11 用户代理字符串(UserAgent)中的垃圾信息
  6. mysql集合与集合的子集_大集合List分为多个子集合
  7. 由于权限引起的Tomcat中项目某些页面访问不了
  8. MFC ListCtrl和IP控件的使用杂记
  9. pycharm中两个.py文件相互调用和传递参数
  10. java 中j= i_java中 i = i++和 j = i++ 的区别
  11. 分布式文件系统MooseFs部署(二)
  12. java web初级面试题_Java Web应用程序初学者教程
  13. Hexo + Github搭建自己的博客
  14. 小甲鱼零基础入门python课后作业及答案_小甲鱼python视频第四讲(笔记及课后习题答案)...
  15. python爬虫——打造个人专属pubmed文献搜索工具
  16. social-engineer-toolkit搭建-网站克隆钓鱼
  17. 最新HTML完整结构
  18. Regionals 2014 Asia - Daejeon
  19. C9、E9、Z14、五院四系…这些高校联盟,光听名字就觉得很厉害!
  20. Pandas 获取列名

热门文章

  1. llvm greedy register allocator
  2. 360可以修复服务器系统吗,可以通过360急救箱修复系统
  3. utc时间 单位换算_将UTC日期转换为毫秒
  4. Google战略的深远意义
  5. 雅典娜暴利烹饪系列(下)
  6. 补码,负数比整数多表示一个
  7. influxdb java api使用_InfluxDB使用HTTP的API查询数据
  8. monkey命令——压力测试——个人总结
  9. 安卓SDK——广告植入
  10. 数据库面试考题一览(全面覆盖)