Spring IOC 应用进阶

Spring IOC 应用进阶

1.1.Bean对象属性值的注入

在Spring中对Bean属性赋值的过程我们称之为依赖注入.Spring应用中为Bean的属性注入值的方式有两种,set注入和构造注入,set注入式通过对象的set方法为对象属性赋值,构造注入为通过bean对象的构造方法为属性注入值.

1.1.1.直接量值的注入

Spring 直接量值的注入指的是通过Spring IOC为对象的8种封装类以及String类型的属性注入值。

例如

定义OpenDataSouce类

public class OpenDataSource {

        private String driverClassName;

        private String url;

        private String username;

        private String password;

        private String maxIdle;

        private String maxActive;

        public OpenDataSource() {}

        public OpenDataSource(int maxIdle,int maxActive){

                this.maxIdle=maxIdle;

                this.maxActive=maxActive;

        }

        public String getDriverClassName() {

                return driverClassName;

        }

        public void setDriverClassName(String driverClassName) {

                this.driverClassName = driverClassName;

        }

        public String getUrl() {

                return url;

        }

        public void setUrl(String url) {

                this.url = url;

        }

        public String getUsername() {

                return username;

        }

        public void setUser(String username) {

                this.username = username;

        }

        public String getPassword() {

                return password;

        }

        public void setPassword(String password) {

                this.password = password;

        }

}

配置OpenDataSource类并通过set方法为对象属性赋值.例如如下配置会先调用bean对象的无参构造函数构建对象,然后通过set方法为属性赋值。

<beanid=‘dataSource‘ class=‘com.jt.common.utils.OpenDataSource‘>

           <property name=‘driverClassName‘ value=‘com.jdbc.mysql.Driver‘ />

           <property name=‘url‘ value=‘jdbc:mysql:///test‘ />

           <property name=‘username‘ value=‘root‘ />

           <property name=‘password‘ value=‘root‘ />

</bean>

当然假如对象提供了对应的构造方法也可以通过指定构造方法为属性注入值,例如在如下配置中可以调用OpenDataSource对象的有两个参数的构造函数构建对象

<beanid=‘openDataSource‘ class=‘ com.jt.common.utils.OpenDataSource‘>

            <!-- 默认按照构造方法参数顺序注入值

                 说明:配置时有几个constructor-arg就是

                 要调用带及格参数的构造函数

             -->

            <constructor-argvalue=‘10‘ />

            <constructor-argvalue=‘100‘ />

</bean>

实际项目中也可以构造注入和set注入混合使用。

<bean id=‘dataSource‘ class=‘com.jt.common.utils.OpenDataSource‘> 

   <constructor-argvalue=‘100‘ />

   <propertyname=‘driverClassName‘ value=‘com.jdbc.mysql.Driver‘ />

   <propertyname=‘url‘ value=‘jdbc:mysql:///test‘ />

   <propertyname=‘username‘ value=‘root‘ />

   <propertyname=‘password‘ value=‘root‘ />

</bean>

说明:依赖注入时可以将配置信息提取到properties文件中,然后通过spring表达式#{id.key}的方式提取数据。

在类路径下定义一个configs.properties文件,内容如下

jdbcDriver= com.mysql.jdbc.Driver

jdbcUrl= jdbc:mysql:///test

jdbcUser= root

jdbcPassword=123456

在spring的配置文件中configs.properties文件

<util:propertiesid=‘cfg‘ location=‘classpath:configs.properties‘ />

在bean中为属性注入值时使用spring 表达式

<beanid=‘dataSource‘ class=‘beans.OpenDataSource‘>

           <propertyname=‘driverClassName‘ value=‘#{cfg.jdbcDriver}‘ />

           <propertyname=‘url‘ value=‘#{cfg.jdbcUrl}‘ />

           <propertyname=‘username‘ value=‘#{cfg.jdbcUser}‘ />

           <propertyname=‘password‘ value=‘#{cfg.jdbcPassword}‘ />

</bean>

其中#为spring表达式特殊标记,{}为表达式内容,cfg为util:properties 标签中定义的id. jdbcUser、jdbcPassword为配置文件等号左边的key

课堂练习:整合C3P0连接池,DRUID连接池(阿里巴巴)

1.1.2.集合对象值的注入:

Spring IOC 如何为集合类型的对象属性注入值,例如

public class Container {

        private List<String> list;

        private Map<String,Object> map;

        private Properties properties;

        public void setList(List<String> list) {

                this.list = list;

        }

        public void setMap(Map<String, Object> map) {

                this.map = map;

        }

        public void setProperties(Properties properties) {

                this.properties = properties;

        }

}

Spring 配置文件中为对象属性注入值。

<bean id=‘collection‘   class=‘beans.Container‘>

         <propertyname=‘list‘>

            <list>

               <value>A</value>

               <value>B</value>

            </list>

         </property>

         <propertyname=‘map‘>

            <map>

              <entrykey=‘k1‘ value=‘100‘ />

              <entrykey=‘k2‘ value=‘300‘ />

            </map>

         </property>

         <propertyname=‘properties‘>

            <props>

               <propkey=‘username‘>root</prop>

               <propkey=‘password‘>123456</prop>

            </props>

         </property>

     </bean>

#### 1.1.3.依赖对象值的注入

实际项目会存在很多个Bean对象,这些对象之间会存在一定依赖关系,当某个Bean对象依赖于其它Bean对象,可以通过spring按照一定的规则(例如按类型或者按名字),进行依赖查找然后进行值的注入.例如:现有一生产者对象(Producer),此对象关联一容器(Container)对象,然后可以通过容器对象存储相关数据。

其代码设计如下:

类的设计

package com.jt.common.utils;

//生产者对象(负责向容器放数据)

public class Producer {//IOC(工厂,容器)

        //生产者关联一个容器对象(目的是要向此容器放数据)

        private Container container;

        public void setContainer(Container container) {

                this.container = container;

        }

        public Container getContainer() {

                return container;

        }

}

类的基本配置

<beanid=‘producer‘ class=‘com.jt.common.utils.Producer‘>

            <!-- 借助ref属性从容器中获取一个id为container

             的对象然后赋值给Producer的container属性 -->

            <propertyname=‘Container‘ ref=‘container‘ />

</bean>

单元测试

public class TestProducer01 extends TestBase{

        @Test

        public void testProducer(){

                //1.获取生产者对象

                Producer pro=ctx.getBean(‘producer‘,Producer. **class );

                Assert._assertNotEquals_( **null** , pro);

                //2.获取生产者关联的容器对象

                Container container=pro.getContainer();

                Assert._assertNotEquals_( **null** , container);

                //3.向容器放数据

                container.getMap().put(‘mysql‘, 100);

                container.getList().add(‘皮皮霞‘);

        }

}

原文地址:https://www.cnblogs.com/wood-life/p/10292711.html

时间: 2024-11-01 13:35:19

Spring IOC 应用进阶的相关文章

Spring IOC高级

1.Spring IOC 注解基本应用 1.1.Spring Bean 注解描述 1.2.Spring Bean 注解应用 1.2.1.Bean对象声明注解应用 1.2.2.Bean对象作用域注解应用 1.2.3.Bean对象生命周期方法注解应用 1.2.4.Bean对象自动装配注解应用 2.Spring IOC 注解应用进阶 2.1.@ComponentScan注解应用 2.2.@Bean注解应用 2.3.@Value与@PropertySource注解应用 3.总结 3.1.重点和难点分析

Spring IoC/DI

前言 假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互.定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件. 传统方式 这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new IDao testDao = new TestDao(); 这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下.当项目需要更换组件时需要修

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

Spring IOC的实现

来源:知乎 https://www.zhihu.com/question/21035417/answer/142858103 著作权归作者所有. Spring IOC的实现部分,主要分为三个部分: 第一步: Resouce:首先我们需要获取beanDefinition的资源,我们将通过Spring的resource接口获得bean的资源,这一步也叫做bean资源的定位,下面是Spring内置的一些典型实现,当然,你也可以根据自己的需要实现自己的resource: ClassPathResourc

spring IOC

本节要点: IOC容器概述 IOC容器的工作原理 BeanFactory接口及常用实现类XmlBeanFactory ApplicationContext接口及常用实现类 BeanFactory和ApplicationContext的区别 1  IOC容器概述 Spring的IoC容器实现了控制反转,即在开发过程中,开发人员不需要关心容器是怎样的,也不需要调用容器的任何API.容器会自动进行被管理对象的初始化及对象之间依赖关系的维护. 在Spring中,最重要的是两个包,提供了IoC容器的基本功

Spring IOC理解

内容来自http://blog.csdn.net/qq_22654611/article/details/52606960 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846 1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技

谈谈对Spring IOC的理解(转)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

Spring Data JPA进阶——Specifications和Querydsl

Spring Data JPA进阶--Specifications和Querydsl 本篇介绍一下Spring Data JPA中能为数据访问程序的开发带来更多便利的特性,我们知道,Spring Data repository的配置很简单,一个典型的repository像下面这样: public interface CustomerRepository extends JpaRepository<Customer, Long> { Customer findByEmailAddress(Str

Spring学习(二)spring ioc注入的三种方式

一.spring ioc注入有哪三种方式: a setter 原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法:"让ioc容器调用该setter方法",将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中. b 构造器 原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数.ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值:将ioc实例化的依赖对象作为构造器的参数传入