Spring学习从总体上把握Spring框架

Posted sihai_1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习从总体上把握Spring框架相关的知识,希望对你有一定的参考价值。

首先来谈一谈什么是Spring框架和Spring可以解决什么样的问题?

使用spring的好处?
1,降低组件之间的耦合度,实现软件各层之间的解耦
2,可以使用容器提供众多的服务,如:创建session实例,管理事物,管理消息服务等等。
3,ioc容器提供单例支持,无需开发者编写实现代码。
4,提供aop技术,可以轻松实现权限拦截,运行期监控等功能。
5,容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。
6,Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。

<一>

Spring是一个开源的控制反转(IoC)和面向切面(AOP)的容器框架。它的主要目是简化应用的开发。
Spring的IOC容器包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,
也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的。

<二>
Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等。
Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring。
Spring是一个轻量级容器架构。怎么区分一个框架是属于轻量级框架还是属于重量框架呢?
其实划分一个应用是否属于轻量级还是重量级,主要看它使用了多少服务。使用的服务越多,容器要为普通java对象做的工作就越多,必然会影响到应用的发布时间或者运行性能,就属于重量级的,反之就是轻量级的。

什么是IOC?

IOC(Inversion of Control的简写):控制反转,它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。


什么是DI?

DI(Dependency Injection的简写):依赖注入,所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

什么是AOP?

AOP(Aspect Oriented Programming的简写):面向切面编程,(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序统一添加功能的一种技术。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。使用JDK的动态代理可以实现AOP。


Spring的模块图如下所示:


Bean的生命周期:
1)Singleton(单例,默认)回顾单例模式:单例模式的意思就是只有一个实例,分为饿汉式(加载类时就初始化实例)
懒汉式(第一次调用getInstance()时才生成实例)两种实现方案。
在Spring IoC容器中定义的bean默认只有一个实例(单例的),且默认情况下会在容器启动时初始化bean(饿汉式)
但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean(懒汉式),这时候,只有第一次获取bean会才初始化bean.

在配置文件中,配置bean的实例为:单例
<!-- 默认是单例的,可以使用scope属性改变设置。
scope属性:singleton 表示单例,prototype 表示多例。 -->
<bean id="userDao1" class="cn.lsh.spring.dao.UserDao" scope="singleton"></bean>

2)Prototype(表示每次获取的都是新对象)
在配置文件中,配置bean的实例为:多例
<!-- scope属性:prototype 表示多例。-->
<bean id="userDao2" class="cn.lsh.spring.dao.UserDao" scope="prototype"></bean>

指定bean的初始化方法和销毁方法:
1,创建类:

public class UserDaoImpl implements UserDao 
	public void init() 
		System.out.println("UserDaoImpl初始化了");
	
	public void destroy() 
		System.out.println("UserDaoImpl销毁了");
	
	
2,配置applicationContext.xml:
<bean id="userDao" scope="singleton" 
	init-method="init"
	destroy-method="destroy"
	class="cn.itcast.g_init_destroy.UserDaoImpl"/>
3,测试:
@Test
public void test1() 
	ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml", getClass());
	Object dao = ac.getBean("userDao");
	System.out.println(dao);
	ac.close(); // 一定要关闭才会执行destroy-method( bean的scope也不能是prototype)

需要注意的是:
1,如果scope属性为prototype则不受spring缓存的控制,destory方法也将不会执行(scope调为singleton时才会有效)。
2,要调用ApplicationContext的close()方法才会执行destory方法(在ApplicationContext接口中没有close()方法,
需要强转为具体的实现类才可以调用)。


依赖注入的二种方式:

《一》依赖注入----手工装配(基于xml方式):
1,通过setter方法注入:

<!-- 通过setter注入 -->
<bean id="userDao1" class="cn.lsh.spring.dao.UserDaoImpl">
	<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>
2,基于构造器注入:
<!-- 通过构造方法注入,会自动按顺序与参数匹配 -->
<bean id="userDao2" class="cn.lsh.spring.dao.UserDaoImpl">
	<constructor-arg value="jdbc:mysql:///test"></constructor-arg>
	<constructor-arg value="com.mysql.jdbc.Driver"></constructor-arg>
	<constructor-arg value="root"></constructor-arg>
	<constructor-arg value="root"></constructor-arg>
</bean>


《二》依赖注入----手工装配(基于注解方式):
使用使用@Resource注解方式进行装配,需要在xml配置文件中配置以下信息:
1、引入context命名空间。
2、在配置文件中添加context:component-scan标签。
applicationContext.xml配置文件如下:
<?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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
			
	<!-- 设置为自动扫描与装配bean,扫描指定包及其所有下级包中的类,可以写多个,之间用英文的逗号隔开 -->
	<context:component-scan base-package="cn.lsh.spring"></context:component-scan>	
</beans>

在类中使用(定义bean):spring2.5之后引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。
功能介绍:
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定当前bean的作用域。


在类中使用(注入bean):这需要通过@Resource注解实现,@Resource注解可以标注在字段或属性的setter方法上,

但它默认按名称装配。
名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。

但一旦指定了name属性,就只能按名称装配了。

@Resource(name="personDao")
private PersonDao personDao;;//用于字段上

@Resource(name="personDao")
public void setPersonDao(PersonDao personDao) //用于属性的set方法上
       this.personDao = personDao;
后一种相当于xml配置文件中的
<property name=“personDao" ref="personDao" />

以上是关于Spring学习从总体上把握Spring框架的主要内容,如果未能解决你的问题,请参考以下文章

jsp,用spring框架连接oracle数据库

spring框架的设计理念与设计模式分析

Spring 框架的设计理念与设计模式分析

Spring 框架的设计理念与设计模式分析

(转)spring源码解析,深入了解spring

最直白解释spring核心组件(CoreContext和Beans)