《Spring in action》——学习总结(一)

本文是《Spring in Action》的学习总结,主要探讨Spring的Bean装配,包括Bean的作用域、初始化和销毁方法,以及如何通过XML配置文件注入Bean属性。Spring提供了多种装配方式,如singleton和prototype作用域,以及通过init-method和destroy-method指定初始化和销毁方法。此外,文章还展示了如何通过setter注入来装配Bean的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上学的很吃力,可能是前面的Java没学好吧,遂在图书馆找了本《Spring in action》看看,刚开始看,感觉还行。

Spring 简述

通过面向POJO编程、依赖注入、AOP和模板技术四个方面来简化Java开发的复杂性。

Tips:
POJO,Plain Ordinary Java Object的缩写,但是它通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类。POJO实质上可以理解为简单的实体类,
顾名思义POJO类的作用是方便程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。

AOP,Aspect Oirented Programming的缩写,即面向切面编程,特质与依赖注入相似,帮助应用对象解耦。借助于AOP,可以将遍布应用的关注点(例如事务和安全)从他们所应用的对象中解耦出来。

Spring自带两种容器的实现,Bean工厂(bean factoried,由org.springframework.beans.factory.BeanFactory定义)是最简单的容器,提供基本的DI支持和应用上下文(application context,由org.springframmework.context.ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务。
注:Bean工厂对于大多数应用来说往往太低级,因此应用上下文更收欢迎。

应用上下文的类型,下面是三种最常见的类型
1、ClassPathXmlApplicationContext——从类的路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源。
2、FileSystemXmlApplicationContext——读取文件系统下的XML配置文件并加载上下文定义。
3、XmlWebApplicationContext——读取Web应用下的XML配置文件并装载上下文定义。

装配Bean

装配,创建应用对象之间协作关系的行为,也是依赖注入的本质。

声明Bean

Spring 容器提供了两种配置Bean的方式。传统上,Spring使用一个或多个XML文件作为配置文件,而Spring3.0中提供了基于Java注解的配置方式(先不了解)。

Spring的核心框架自带了10个命名空间配置包括aop(声明切面)、beans(声明bean和装配bean)、context(为配置Spring应用上下文提供了配置元素)、jee、jms、lang、mvc、oxm(支持Spring的对象到XML的映射)、tx(声明式事务配置)、util(提供工具类元素)。

以下为一个典型的SpringXMl配置文件:

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

    <!-- 注入对象类型属性 -->  
    <!--  配置service和dao对象 -->  
    <bean id="userDao" class="cn.ywq.ioc.UserDao"></bean>   

    <bean id="userService" class="cn.ywq.ioc.UserService">   
        <!-- 注入dao对象   
            name属性值:service类里面属性名称  

            ref属性:dao配置bean标签中id值 -->  

        <property name="userDao" ref="userDao"></property>  
    </bean>   

</beans>  

Bean的作用域

当在Spring中配置元素时,我们可以为Bean声明一个作用域。只需配置Bean的scope属性。
Spring提供的几种作用域选项:

  • singleton,在每个Spring容器中,一个Bean定义总有一个对象实例(默认)
  • prototype,允许Bean的定义可以被实例化多次(每次调用都创建一个实例)
  • request,在一次HTTP请求中,每个Bean定义对应一个实例。
  • session,在一个HTTP Session中,每个Bean定义对应一个实例。
  • global-session,在一个全局HTTP Session中,每个Bean定义对应一个实例。

初始化和销毁Bean

为Bean定义初始化好销毁操作,只需要使用init-method和destroy-method参数来配置元素。
代码实例,我们设想一个叫Auditorium的Java类,它代表表演大厅。这个要实现两件非常重要的事情:在表演前开灯和在表演结束后关灯。
为支持这两项活动,Auditoium类需要编写turnOnLights()和turnOffLights()方法:

public class Auditorium{
    public void turnOnLights(){
    ...
    }
    public void tuenOffLights(){
    ...
    }
}

这两个方法的实现细节并不是特别重要,重要的是在开始前必须调用turnOnLights()方法,在结束后调用turnOffLights()方法。为实现需求,我们可以使用init-method和destroy-method属性来声明Auditorium Bean:

<bean id = "auditorium"
        class = "com.springinaction.springidol.Autorium"
        init-methd = "turnOnLights"
        destroy-method = "turnOffLights"/>

为Bean定义初始化和销毁方法的另一种可选的方式是让Bean实现Spring的InitializingBean和DisposableBean接口。

注入Bean属性

Spring中使用<property>元素配置Bean的属性。<property>在许多方面都与<constructor-arg>类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的setter方法来注入值。

Instrumentalist类

package com.springinaction.springidol;
public class Instrumentalist implements Performer{
    public Instrumentalist(){
    }
    public void perform() throws PerformanceException{
        System.out.print("Playing"+song+":");
        instrument.play();
    }
    private String song;
    public void setSong(String song){ //注入歌曲
        this.song = song;
    } 

    public Stirng getSong(){
        return song;
    }
    public String screamSong(){
        return song;
    }

    private Instrument instrument;

    public void setInstrument(Instrument instrument){                 //注入乐器
        this.instrument = instrument;
    }

}

以上代码可以看出Instrumentalist有两个属性:song和instrument。song属性持有演奏家的歌曲名字,而且会在perform()方法中被用到。

Instrument接口

package com.springinaction.springidol;

public interface Instrument{
    public void play();
}

XML配置文件部分

<bean id = "kenny"
class = "com.springinaction.springidol.Instrumentalist">
    <property name = "song" value = "Jingle Bells"/>
</bean>

为了让kenny顺利演出,还要让这个乐器实现Instrument接口。

Tip:依赖注入不仅仅只是装配硬编码的值,它真正的价值子在于把相互协作的对象装配在一起,而不需要这些对象自己负责装配。

sax0phone实现了Instrument接口

package com.springinaction.springidol;

public class Saxophone implements Instrument{
    public Saxophone(){
    }
    public void play(){
        System.out.println("TOOT TOOT TOOT...");
    }
}

在kenny演奏萨克斯之前,我们必须在Spring中将它声明为一个Bean。如以下XML代码所示:

<bean id = "saxophone"
class = "com.springinaction.springidol.Saxophone"/>

修改kenny Bean的配置。使用setter注入为instrument属性设值:

<bean id = "kenny2"
class = "com.springinaction.springidol.Instrumentalist">
<property name = "song" value = "Jingle Bells" />
<property name = "instrument" ref = "saxophone" />

现在kenny Bean已经注入了所有的属性,并且可以准备演出了。

目录 第部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 1.3.1依赖注入 1.3.2di应用 1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文 2.1.3bean的生命 2.2创建bean 2.2.1声明个简单的bean 2.2.2通过构造函数注入 2.3注入bean属性 2.3.1注入简单的数值 2.3.2使用其他的bean 2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊bean 3.5.1后处理bean 3.5.2bean工厂的后处理 3.5.3配置属性的外在化 3.5.4提取文本消息 3.5.5程序事件的解耦 3.5.6让bean了解容器 3.6脚本化的bean 3.6.1给椰子上lime 3.6.2脚本化bean 3.6.3注入脚本化bean的属性 3.6.4刷新脚本化bean 3.6.5编写内嵌的脚本化bean 3.7小结 第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 5.2.3基于jdbc驱动的数据源 5.3在spring里使用jdbc 5.3.1处理失控的jdbc代码 5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5springjava持久api 5.5.1使用jpa模板 5.5.2创建个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2缓存的代理bean 5.7.3注解驱动的缓存 5.8小结 第6章事务管理 6.1理解事务 6.1.1仅用4个词解释事务 6.1.2理解spring对事务管理的支持 6.2选择事务管理器 6.2.1jdbc事务 6.2.2hibernate事务 6.2.3jpa事务 6.2.4jdo事务 6.2.5jta事务 6.3在spring中编写事务 6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理投票弃权 7.4保护web应用程序 7.4.1代理springsecurity的过滤器 7.4.2处理安全上下文 7.4.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值