【菜鸟SSH入门详解之Spring】

作者: 红色黎明 分类: Java 发布时间: 2016-04-17 17:08

Spring是SSH框架的重要核心,SSH可以没有Struts,Hibernate也可以用ibatis或myibatis代替,但是Spring确实是最不可或缺的。下面是这篇讲解的目录摘要。

1、Spirng的基本概念:IOC,三种注入模式、bean赋值、AOP面向切面编程、Spring的核心组件

2、Spring的运行原理

3、Spring的设计模式

4、Spring的具体应用

5、Spring注解详解

一、Spring的基本概念

Spring是面向bean、对象之间的依赖关系,提供注入依赖机制。

1、IOC,控制反转模式(也称依赖注入),由程序管理对象交给了容器管理,负责实例化、定位、配置应用程序中的对象以及建立对象的依赖,对象创建责任反转,在Spring中BeanFactory是IOC容器的核心接口。

2、Spring依赖注入的三种模式:接口注入、Setter方法注入、构造方法注入。

1)接口注入

2)Setter方法注入

3)构造方法注入

3、bean为构造函数赋值

4、AOP

面向方面的编程,不同于OOP(面向对象),对横切关注点和横切典型的职责分界线行为进行模块化,将影响多个类的行为封装成可重用的模块。例如事务管理、日志等。

AOP的配置和使用:

5、Spring的核心组件:Core、Context和Beans

1)Beans:Bean的定义、Bean的创建、Bean的解析。Spring成功解析<bean/>节点只会,在内部转化成BeanDefinition对象,以后所有操作均对这个对象完成。

2)Context:为Spring提供一个运行时的环境,用以保存各个对象的状态。ApplicationContext是Context的顶级父类,Application继承了BeanFactory(容器运行的主题对象是bean)、ResourceLoader(可以访问到任何外部资源,Context把资源的加载、解析和描述工作委托给了ResourcePatternResolver类来完成),ApplicationContext主要完成:标识一个应用环境,利用BeanFactory创建Bean对象,保存对象关系表,捕获各种事件。

3)Core组件:包括了很多关键类,其中一个重要组成部分就是定义了资源的访问方式。

二、Spring的原理,除了上述的核心组件外,按以下步骤运行

1)构建BeanFactory

2)注册事件

3)创建bean实例

4)触发被监听事件

三、Spring的设计模式

1、单例模式,应用生命周期的每个对象实例均是Singleton

2、工厂模式

1)简单工厂模式

产品类、工厂类均是实体类。从工厂类生产产品实例。

2)工厂模式

每个产品类有对应的抽象产品和具体产品,每个工厂类有对应的抽象工厂和具体工厂,具体工厂里的创造产品方法直接实例化对应的产品。每一个产品对应一个工厂,由对应工厂产生对应产品对象。

3)抽象工厂模式

每个产品类有对应的抽象产品和具体产品,只有一个抽象工厂和对应的具体工厂类,抽象工厂类中包含多个生产不同产品的接口,同一工厂可以生成不同产品。

3、代理模式

Subject:抽象主题,它是代理对象的真实对象要实现的接口,可以多个接口组成。
ProxySubject:代理类除了实现抽象主题定义的接口外,还必须持有所代理对象的引用。
RealSubject:被代理的类,是目标对象。

4、策略模式

策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3) 具体策略对象:它封装了实现同不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

四、Spring的应用

1、web.xml配置context-param和listener监听

web.xml中定义servlet上下文参数,在整个应用中必须唯一。配置Spring,必须配置<listener>,而<context-param>则可有可无,若无,则默认加载/WEB/INF/applicationContext.xml文件;若有,则加载自定义路径下的xml,多个xml之间用逗号隔开。”**/applicationContext-*.xml” 可以表示任意目录下的以”applicationContext-“开头的XML文件。

程序部署到tomcat后,src目录下的配置文件会和class文件一样,自动copy到应用的 WEB-INF/classes目录下。classpath:与classpath*:的区别在于:前者只会从第一个classpath中加载,而后者会从所有的classpath中加载,不仅包含class路径,还包括jar文件中(class路径)进行查找。
lib和classes下文件访问优先级的问题:lib>classes

web.xml配置如下:

2、applicationContext.xml中定义bean

3、具体使用的类中定义好对象变量以及Getter和Setter方法

五、Spring注解

Spring利用关键字注解,可以省略bean配置参数,框架自动进行注入。

1、在applicationContext.xml中定义bean,在方法中直接获取对象

2、@Autowired注入

当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。

按照下面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量用@Autowired 后,可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。

由于 Boss() 构造函数有两个入参,分别是 car 和 office,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为Boss(Car car ,Office office) 的入参来创建 Boss Bean。

3、@Autowired(required = false)

当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件)

4、@Qualifier(“office”)

若有两个id不同但类相同的bean,使用@Qualifier(“office”) 指定使用哪个bean,“office”是 Bean 的id,所以 @Autowired 和@Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而@Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和@Qualifier 统一成一个注释类。

5、@Resource

@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面@Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将@Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。@Resource(type=Car.class)为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。

6、bean一句话配置

<context:annotationconfig/> 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。

7、完全移除xml的bean配置,纯注解设置bean和注入bean

@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。

@Service 通常作用在业务层,但是目前该功能与 @Component 相同。

@Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。

@Repository 只能标注在 DAO 类上,但是目前该功能与 @Component 相同。

Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Component 是完全相同的。

1)beans中需要进行如下配置,<context:component-scan/> 的 base-package 属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。值得注意的是 <context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

2)具体类中的使用

@Component 有一个可选的入参,用于指定 Bean 的名称,在 Boss 中,我们就将 Bean 名称定义为“boss”。一般情况下,Bean 都是 singleton 的,需要注入 Bean 的地方仅需要通过 byType 策略就可以自动注入了,所以大可不必指定 Bean 的名称。在使用 @Component 注释后,Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略。

8、当需要每次都获取到新的实例时,使用@Scope(“prototype”)

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注