Spring3 IOC

Spring3的IoC与Spring2类似,只不过在表现形式上会有些许不同,下面就详细讲讲在Spring3中支持的IoC表示方式

第一种:基于XML配置

  在Spring1.0的时候,使用DTD格式,Spirng2.0以后使用Schema格式,从而使不同配置类型有了自己的命名空间,简化了配置工作。

  装配一个Bean

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
 6
 7
 8     <bean id="car" class="com.baobaotao.simple.Car"/>
 9     <bean id="boss" class="com.baobaotao.simple.Boss" />
10 </beans>

每一个Bean都需要指定唯一的一个id,id名称需要符合XML对id的命名规范。

如果希望对Bean的名称定义使用一些特殊字符,可以使用name属性代替id熟悉,一个Bean可以对应多个name属性值,值之间使用","分割即可

不同的Bean允许使用相同的name值,但是这就发生了覆盖,所以尽量使用id,因为一旦有重,就会被检测到。

如果id与name都没有指定,那么这个Bean的全限定类名就是默认的Bean的名称。

如果多个相同class值的Bean同时存在,如何获取呢? getBean("className"),getBean("className#1")getBean("className#2")

  依赖注入

1     <bean id="car" class="com.baobaotao.ditype.Car">
2         <property name="maxSpeed" value="200"/>
3         <property name="brand" value="红旗CA72"/>
4         <property name="price" value="20000.00"/>
5     </bean>

上述代码属于属性注入,每一个被注入的属性都需要提供对应的setter方法

除了属性注入外,还有构造函数注入,工厂方法注入,不常用,不再累述

支持级联属性的注入

集合类型的注入(使用util命名空间可以大大简化配置)

  p命名空间的使用

<?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-3.2.xsd">

    <bean id="car" class="com.baobaotao.ditype.Car"
        p:brand="红旗CA72"
        p:maxSpeed="200"
        p:price="20000.00" />

</beans>

  自动装配

每个Bean元素都有一个autowire属性可以指定自动装配的类型

  byName

  byType

  contructor

  autodetect

自动装配虽然简化了配置,但是使得Bean之间的关系很不清晰,实际开发中很少用

  Bean之间的关系、

  继承:父类增加abstract="true"属性,子类通过parent属性设置父类。父类也可以不指定abstract属性,这样就会被Sping实例化

  依赖:如果一个Bean依赖与另一个Bean,要们在书写配置信息的时候通过位置先后顺序,要么使用depends-on属性指定依赖的实例。这样就能够保证依赖关系的正确

第二种:基于注解的配置

  不管是使用XML还是注解,它们都是表达Bean定义的载体,其实质都是为Spring提供Bean的定义信息。

  XML分离了Bean定义信息与Bean实现类

  注解则是在定义Bean的时候就将定义信息通过注解进行了说明

  那么如何使用呢?思路就是两条,第一,在Spring配置文件中打开注解器,第二,为需要注解的Bean增加注解信息

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.2.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!--打开自动扫描-->
    <context:component-scan base-package="com.baobaotao.dao"/>
    <context:component-scan base-package="com.baobaotao.service"/>

    ......
</beans>

如上,就打开了注解器,将指定包下的类全部纳入了Spring管理器,当然,这些能够被纳入Spring容器的类需要经过一些注解的处理

package com.baobaotao.dao;

import com.baobaotao.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Created by sherry on 000028/6/28 0:53.
 */
@Component("userDao")
public class UserDao {
...
}

@Controller  对控制器进行注解(Action等)

@Service  对Service进行注解

@Repository  对Dao进行注解

@Component  对其他需要纳入Spring容器的Bean进行注解

关于 <context:component-scan base-package="com.baobaotao.dao"/>

默认会扫描该包及其子包下的所有类

<context:component-scan base-package="com.baobaotao.dao" resource-pattern="anno/*.class"/>

扫描基包下指定子包下的所有类

如果需要实现更复杂的过滤规则,可以通过<context:component-scan>的过滤子元素实现

  自动装配Bean

    所有自动装配Bean,就是Bean通过注解自己去Spring容器中获取所依赖的对象

    使用@Resource和@Autowired注解

    默认@Autowird按照类型装配

    @Autowired
    @Qualifier("jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
Qualifier可以指定装配名称

第三种:基于Java类的配置一个Java配置类就相当于一个Spring配置文件普通的POJO只要标注了@Configuration注解,就可以为Spring提供Bean的定义信息了。
@Configuration注解本身已经实现了@Component
package com.baobaotao.conf;

import com.baobaotao.dao.LoginLogDao;
import com.baobaotao.dao.UserDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by sherry on 15-6-28.
 */
@Configuration
public class DaoConf {
    @Bean
    public UserDao userDao(){
        return new UserDao();
    }

    @Bean
    public LoginLogDao loginLogDao(){
        return new LoginLogDao();
    }
}
package com.baobaotao.conf;

import com.baobaotao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by sherry on 15-6-28.
 */
@Configuration
public class ServiceConf {
    @Autowired/*daoConf 本身也能够被注入到其他Java配置配中 相当于XML 中的import*/
    private DaoConf daoConf;

    @Bean
    public UserService userService(){
        return new UserService();
    }
}

如何启动通过Java类配置的Spring容器呢?

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class)

LoginService loginService = ctx.getBean(LoginService.class)

或者

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

ctx.register(DaoConf.class)

ctx.register(ServiceConfig.class)

ctx.refresh()

相当于读取多个XML配置文件

如果不想引入多个Java配置类,那么可以在Java配置类中使用 @Import(DaoConf.class) 注解,这样就只要进入一个即可,相当于XML中使用import,然后读取配置文件的时候只要读取一个总配置文件就行了

三种Bean配置方式的使用场景

个人觉的,一个比较好的方式是对于对于第三方jar包中的类,使用XML进行配置,自己的类,使用注解的方式配置。

XML中仅包含主题设置与第三方类的配置

时间: 2024-10-17 21:39:13

Spring3 IOC的相关文章

通俗化理解Spring3 IoC的原理和主要组件

?什么是IoC? ?通俗化理解IoC原理 ?IoC好处 ?工厂模式 ?IoC的主要组件 ?IoC的应用实例 ?附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(IoC)模式,IoC又叫做依赖注入(DI). 什么是控制反转呢?答案就是"获得依赖对象的过程被反转了",获得依赖对象的过程由自身管理对象变为由IoC容器主动注入,于是控制反转又叫做依赖注入.那么"控制反转"完全就是"依赖注入"咯?其实,我们可以将&quo

spring3.2.5学习(二)——IoC注解配置

一.前言 这篇随笔主要是记录IoC完全使用Annotation的过程. 二.架包以及资源 架包的引入,以及项目结构参考spring3.2.5学习(一)——spring环境配置以及IOC简介: 三.配置环境 1.配置applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/

【框架】[Spring3]下载安装、开源框架与IoC控制反转详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 昨天刚刚初学Spring3,也许Spring3有点老了哈,不过还是先把3学了再去学习4吧,首先先介绍一下如何去下载Spring的必须包吧. (本篇博客适用于初学Spring的朋友) java spring4现在不推荐使用xml配置文件- 当然啦,这些知识点在Spring4还是可以用的. 不过我在这里详解的还是Spring3哈,见谅~ 下载SpringJAR包/文档: Spring官

Spring3.x企业开发应用实战读书笔记 —— 第三章IoC容器概述

声明:    本篇博客绝大多数内容为<Spring3.x企业开发应用实战>一书原内容,所有版权归原书作者所有!,仅供学习参考,勿作他用! 3.2 相关Java基础知识 Java语言允许通过程序化的方式间接对Class对象实例操作,Class文件由类装载器装在后,在JVM(Java虚拟机)中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息: 如构造函数.属性和方法等.Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这就为使用程

开涛spring3(2.1) - IoC基础

2.1.1  IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对 象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们 来深入分析一下: ●谁控制谁,控制什么:传 统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而IoC

Spring3.0第二讲:什么是IOC

对于IOC(Inversion of Control),很多人有不同的见解,这相当于"一千人心中有一千个哈姆雷特",其实说来说去总是离不开"控制反转"和"依赖注入".不要把IOC当成一种什么的很高深的技术,它只是一种概念,告诉你Spring针对程序解耦的实现方法. 首先我们来详细说一下什么叫"控制反转",分解为两个关键词:控制和反转 ①传统的JavaSE中我们如果在一个对象引入其他对象,习惯用new,这样我们就可以用这个对象资

【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3

2.3.1  XML配置的结构 一般配置文件结构如下: java代码: 查看复制到剪贴板打印 <beans> <import resource="resource1.xml"/> <bean id="bean1"class=""></bean> <bean id="bean2"class=""></bean> <bean name

开涛spring3(2.2) - IoC 容器基本原理及其helloword

2.2.1  IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装.在Spring中BeanFactory是IoC容器的实际代表者. Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配.一般使用基于xml配置文件进行配置元数据,而且

spring3.2.5学习(一)——spring环境配置以及IOC简介

经常听别人说学技术的时候挑些有用的学更靠谱一点,然后就将很多的原理啊.逻辑啊什么的全扔一边,我想这就是实用主义者的主张了,一切以实用为主.之前,自己也是这么做,后来发现这样很容易达到瓶颈,没有一个全面的知识体系,根本就不知道还有什么好玩的.所以在实用的基础上,自己又琢磨着如何扩展知识,补全整个知识体系结构. 学习spring,不可避免的就是查文档了.可以到SPRING官网下一个spring-framework-3.2.5.RELEASE包,打开目录/docs/spring-framework-r