一点一滴学习Spring(一)

我在项目中经常用到Spring框架,虽然可以应用,可是回顾一下,我竟然都没有好好的学习过Spring,So,打算学习一下Spring,为了之后的项目更好的应用。

学习过程:Spring简单应用 -> Spring 高级篇重点内容重点内容

Spring是什么?

Spring 是开源的控制反转和面向切面的容器框架,它主要目的是简化企业开发。

控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的,控制权的转移即所谓的反转

Spring的优点

1、降低模块之间的耦合度
2、提供了很多服务,如事务管理服务、消息服务、Spring-core核心服务、持久化服务等
3、容器提供了单例模式
4、容器提供了AOP技术,可以很方便的做权限拦截、运行期监控等
5、容器对主流的应用框架提供了集成支持、

本博客重点:Spring项目搭建+Spring管理bean

Spring框架的所有jar及其作用

spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar。

spring-aop-3.2.4.RELEASE
spring的面向切面编程,提供AOP(面向切面编程)实现
spring-aspects-3.2.4.RELEASE Spring独立的asm程序,Spring2.5.6的时候需要asmJar 包3.2.4开始提供他自己独立的asmJar
spring-beans-3.2.4.RELEASE
SpringIoC(依赖注入)的基础实现
spring-context-support-3.2.4.RELEASE
Spring-context的扩展支持,用于MVC方面
spring-context-3.2.4.RELEASE
Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等
spring-core-3.2.4.RELEASE:
Spring3.2.4的核心工具包
spring-expression-3.2.4.RELEASE:
Spring表达式语言
spring-instrument-tomcat-3.2.4.RELEASE: Spring3.2.4对Tomcat的连接池的集成
spring-instrument-3.2.4.RELEASE :
Spring3.2.4对服务器的代理接口
spring-jdbc-3.2.4.RELEASE:
对JDBC的简单封装
spring-jms-3.2.4.RELEASE:
为简化JMS API的使用而作的简单封装
spring-orm-3.2.4.RELEASE:
整合第三方的ORM框架,如hibernate,ibatis,jdo,以及 spring的JPA实现
spring-oxm-3.2.4.RELEASE :
Spring 对Object/XMl的映射支持,可以让Java与XML之间来回切换
spring-test-3.2.4.RELEASE:
对Junit等测试框架的简单封装
spring-tx-3.2.4.RELEASE :
为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理
spring-webmvc-portlet-3.2.4.RELEASE:
基于protlet的MVC实现
spring-webmvc-3.2.4.RELEASE :
基于servlet的MVC实现
spring-struts-3.2.4.RELEASE:
整合Struts的时候的支持
spring-web-3.2.4.RELEASE :
SpringWeb下的工具包

一、创建简单的Spring项目

1、创建一个web(Dynamic Web Project)项目
2、引入jar
一点一滴学习Spring(一)_第1张图片
3、加入配置文件
配置文件可任意命名,如bean.xml
最简单的bean.xml如下


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

4、使用Junit测试是否创建成功

@Test
    public void test() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[] {"bean.xml"});
    }

Junit测试通过,说明Spring 项目创建成功

二、为Spring 项目加入bean管理

在bean.xml文件的内部添加你要管理的bean
如:


<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.xsd">
       <bean id="personBeanService" class="com.cn.service.impl.PensonBeanServiceImpl">bean>
beans>

标签的属性id和name在此文件中均要唯一,通常情况下我们会使用id属性,但是当你起的名称有特殊字符时,id属性会报错,我们要使用name属性。
Id或name的命名规则,骆驼命名法,我们通常使用类名(首字母小写)命名
测试:

@Test
    public void test() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[] {"bean.xml"});
        IPersonBeanService personService = 
                context.getBean("personBeanService", PensonBeanServiceImpl.class);
        personService.save();
    }

辅助类:

package com.cn.service;

public interface IPersonBeanService {

    void save();
}
package com.cn.service.impl;

import com.cn.service.IPersonBeanService;

public class PensonBeanServiceImpl implements IPersonBeanService {

    @Override
    public void save() {
        // TODO Auto-generated method stub
        System.out.println("save personBean-------------");
    }
}

基于XML的配置元数据的基本结构

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

  <bean id="..." class="...">
    
  bean>

  <bean id="..." class="...">
    
  bean>

  
beans>

实例化spring容器方法:

ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"xxx.xml", "yyy.xml"});

实例化spring管理的bean

Object service = context.getBean("id或name");

三、spring实例化bean的三种方法

1、采用默认的构造函数实例化,如上述示例,被9成人使用

2、静态工厂方式创建bean
我们需要新建一个工厂类

package com.cn.factory;

import com.cn.service.impl.PensonBeanServiceImpl;

public class BeanFactory {

    public static PensonBeanServiceImpl creatBean(){
        PensonBeanServiceImpl pensonService = new PensonBeanServiceImpl();
        return pensonService;
    }

}

工厂类中有实例化某类的方法,注意此方法需是静态方法
配置xml文件


<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.xsd">
       <bean id="personBeanService" class="com.cn.factory.BeanFactory" factory-method="creatBean">bean>
beans>

由factory-method属性指定创建bean的静态方法

3、实例工厂方式创建bean
我们也需要新建一个工厂类,此工厂类中亦需一个实例化某类的方法,但是鱼静态工厂方式的区别在于,实例化某类的方法不需要是静态的。
我们知道调用一个类中的非静态方法,一定要先实例化该类,这种方式我们怎么实例化工厂类呢?
答案实在bean.xml文件中实例化,通过代码:

<bean id="beanFactory" class="com.cn.factory.BeanFactory">bean>

实例化后我们使用工厂bena,调用实例化某类的方法,如下配置

<bean id="personBeanService" factory-bean="beanFactory" factory-method="creatBean">bean>

Junit测试通过
Xml配置:


<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.xsd">
       <bean id="beanFactory" class="com.cn.factory.BeanFactory">bean>
       <bean id="personBeanService" factory-bean="beanFactory" factory-method="creatBean">bean>
beans>

四、spring管理实例化的作用域

Attribute : scope

Scope取值:
Singleton(默认值):每次getBean(“a”) 得到的对象是同一个,指向同一个引用
通常为“singleton”(一个共享实例,将由所有调用返回getBean与给定的id),或“原型”(独立实例从每次调用getBean产生)。默认情况下,bean将是单例,除非bean有一个父bean定义,在这种情况下它会继承父级的作用域。 单例是最常用的,是多线程的理想选择服务对象。
Prototype:每次getBean(“a”) 得到不同的对象,每次均创建一个新对象
Request:一次请求范围内bean是同一个
Session:一次会员范围内bean是同一个

五、Spring管理bean的生命周期

Spring什么时候创建bean?
当我们使用默认构造函数创建bean的方法时候,可以在构造函数中打印一句话,用于观察spring何时创建bean
在test类中,我们只初始化spring容器,观察控制台打印:
一点一滴学习Spring(一)_第2张图片

观察得出,spring容器创建时就实例化了对象,此时我们scope作用域是默认的Singleton
若我们将scope作用域改成prototype又如何呢?

一点一滴学习Spring(一)_第3张图片
此时运行初始化spring容器并没有实例化bean,那么我们getBean调用一下试试
一点一滴学习Spring(一)_第4张图片

结论:
当scope=”singleton”时,bean在初始化spring容器时被初始化
当scope=”prototype”时,bean在初始化spring容器时没有被初始化,在getbean时才可被初始化
如何设置scope=”singleton”时,bean使用时才被初始化,不适用不被初始化。需要设置 的lazy-init懒加载属性为true

lazy-init值说明:
指示这个bean是否要被延迟初始化。 如果“false”,它将在启动时由bean实例化执行单例的热切初始化的工厂。 有效默认值为“false”。 注意:这属性不会被子bean定义继承。 因此,需要根据具体情况指定bean定义。 它可以通过’bean’级别的’default-lazy-init’属性共享
在嵌套的’beans’部分的情况下可能继承于外部’beans’默认值

六、Spring容器的销毁

若在中配置destroy-method属性,当spring容器被销毁是则执行bean中方法

"personBeanService" class="com.cn.service.impl.PensonBeanServiceImpl"
       lazy-init="true" destroy-method="destroy">

如上配置,当spring容器销毁时执行PensonBeanServiceImpl类文件中的destroy()方法

你可能感兴趣的:(Spring)