Spring——IOC(三)

六、集合注入

(1)假设UserDAOImpl中有sets,lists,maps三个集合属性

package com.zgy.impl;

import java.util.List;

import java.util.Map;

import java.util.Set;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

public class UserDAOImpl implements UserDAO{

private Set<String> sets;

private List<String> lists;

private Map<String,String> maps;

public Set<String> getSets() {

return sets;

}

public void setSets(Set<String> sets) {

this.sets = sets;

}

public List<String> getLists() {

return lists;

}

public void setLists(List<String> lists) {

this.lists = lists;

}

public Map<String, String> getMaps() {

return maps;

}

public void setMaps(Map<String, String> maps) {

this.maps = maps;

}

public void save(User u) {

System.out.println("user saved");

}

public String toString(){

return "sets size"+sets.size()+"| lists size:"+lists.size()+"| maps size"+maps.size();

}

}

(2)配置文件中配集合元素的值

<?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也可以使用name来标识 -->

<bean name="userDAO" class="com.zgy.impl.UserDAOImpl">

<property name="sets">

<set>

<value>1</value>

<value>2</value>

</set>

</property>

<property name="lists">

<list>

<value>1</value>

<value>2</value>

<value>3</value>

</list>

</property>

<property name="maps">

<map>

<entry key="1" value="1"></entry>

<entry key="2" value="2"></entry>

<entry key="3" value="3"></entry>

<entry key="4" value="4"></entry>

</map>

</property>

</bean>

<bean name="userService" class="com.zgy.service.UserService" scope="prototype">

<!-- <property name="userDAO" ref="u" /> -->

<constructor-arg>

<ref bean="u"/>

</constructor-arg>

</bean>

</beans>

(3)验证:

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

public class UserServiceTest {

@Test

public void testAdd() throws Exception {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");

System.out.println(userDAO);

}

}

(4)结果:

sets size2| lists size:3| maps size4

七、自动装配

自动装配的方式有如下几种实现形式:

byName、byType、autodetect、constructor、default、no

以下测试byName的形式的自动装配

(1)假设有如下的配置文件,配置了如下的三个bean:

userDAO、userDAO2、userService

配置文件如下:

<?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也可以使用name来标识 -->

<bean name="userDAO" class="com.zgy.impl.UserDAOImpl">

<property name="daoId" value="1"></property>

</bean>

<bean name="userDAO2" class="com.zgy.impl.UserDAOImpl">

<property name="daoId" value="2"></property>

</bean>

<bean name="userService" class="com.zgy.service.UserService" autowire="byName">

</bean>

</beans>

以上的配置中,userService这个bean是由按名称自动装配的,在UserService中含有UserDAO这个对象,所以,按照byName的方式可以找到userDAO这个bean,完成自动装配。

(2)UserService类如下:

package com.zgy.service;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

public class UserService {

private UserDAO userDAO;

public void add(User u){

this.userDAO.save(u);

}

public UserDAO getUserDAO() {

return userDAO;

}

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

}

(3)UserDAOImpl类如下:

package com.zgy.impl;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

public class UserDAOImpl implements UserDAO{

private int daoId;

public int getDaoId() {

return daoId;

}

public void setDaoId(int daoId) {

this.daoId = daoId;

}

@Override

public void save(User u) {

System.out.println("user saved");

}

@Override

public String toString(){

return "daoId="+daoId;

}

}

(4)测试:

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

import com.zgy.service.UserService;

public class UserServiceTest {

@Test

public void testAdd() throws Exception {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserService userService= (UserService) applicationContext.getBean("userService");

System.out.println(userService.getUserDAO());

}

}

(5)结果:

daoId=1

以下测试byType的形式的自动装配

(1)修改配置文件成如下形式;

<?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也可以使用name来标识 -->

<!--

<bean name="userDAO" class="com.zgy.impl.UserDAOImpl">

<property name="daoId" value="1"></property>

</bean>

-->

<bean name="userDAO2" class="com.zgy.impl.UserDAOImpl">

<property name="daoId" value="2"></property>

</bean>

<bean name="userService" class="com.zgy.service.UserService" autowire="byType">

</bean>

</beans>

(2)再次测试

(3)结果:

daoId=2

八、生命周期

A)在配置文件中,配置一个bean的时候,可以指定一个lazy-init属性,该属性设置为true的时候,指明该bean先不进行初始化,而是在用到的时候,在使用getBean的时候才会初始化该bean。使用的场景:应用启动时间过长,可以使用此方法。

B)init-method和destory-method不要和prototype一起使用

(1)UserService类中增加init()和destory()方法:

package com.zgy.service;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

public UserDAO getUserDAO() {

return userDAO;

}

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

(2)配置文件中的配置如下:

<?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也可以使用name来标识 -->

<bean name="u" class="com.zgy.impl.UserDAOImpl">

</bean>

<bean name="userService" class="com.zgy.service.UserService" init-method="init" destroy-method="destory">

</bean>

</beans>

(3)测试:

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

import com.zgy.service.UserService;

public class UserServiceTest {

@Test

public void testAdd() throws Exception {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserService userService= (UserService) applicationContext.getBean("userService");

applicationContext.destroy();

}

}

(4)结果:

init

Destroy

时间: 01-20

Spring——IOC(三)的相关文章

spring ioc三种注入方式

spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容器控制程序之间的关系,而不是由代码直接控制 由于控制权由代码转向了容器,所以称为反转 接口注入 Setter 注入 构造器注入 三种依赖注入方式的比较 : 接口注入: 接口注入模式因为历史较为悠久,在很多容器中都已经得到应用.但由于其在灵活性.易用性上不如其他两种注入模式,因而在 IOC 的专题世界

Spring IOC的三种注入方式

Spring IOC三种注入方式: 1.    接口注入 2.    getter,setter方式注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类的方法来完成功能,叫做A类依赖于B类.控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术,由容器控制程序之间的关系,而不是由代码直接控制. 1.接口注入 public class ClassA {  private InterfaceB

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

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

【SSH系列】深入浅出spring IOC中三种依赖注入方式

spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法. 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性.我们可以从以下几个方面理解: a.参与者都

Spring框架参考手册翻译——第三部分 核心技术 6.1 Spring IoC容器和bean的介绍

第三部分 核心技术 这部分参考文档涵盖的这些技术是Spring Framework绝对重要的. 其中最重要的要数Spring框架的控制反转(IoC)容器.深入剖析Spring框架IoC容器之后,紧接着要介绍的是Spring面向切面编程(AOP)技术.Spring框架拥有自己的AOP框架,从概念上很容易理解,并且成功地解决了AOP在Java企业级编程中80%的痛点需求. 还提供了Spring与AspectJ(目前在功能上最丰富,在Java企业领域最成熟的AOP实现)的集成. 第六章,IoC容器 第

【初探Spring】------Spring IOC(三):初始化过程---Resource定位

我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统. Spring IoC容器整体可以划分为两个阶段,容器启动阶段,Bean实例化阶段.其中容器启动阶段蛀牙包括加载配置信息.解析配置信息,装备到BeanDefinition中以及其他后置处理,而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