spring框架 订阅
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。 展开全文
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
信息
目    的
解决企业应用开发的复杂性
使    用
JavaBean
范    围
任何Java应用
外文名
Spring Framework
中文名
Spring框架
创建原因
软件开发的复杂性
功    能
使用基本的JavaBean代替EJB
spring框架起源
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。曾经使用过EJB开发JAVA EE应用的人,一定知道,在EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一些开发工作随着xdoclet的出现,而有所缓解,但是学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。而Spring出现的初衷就是为了解决类似的这些问题。Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发JAVA EE企业级应用的一些设计思想和具体的做法。有时间了可以详细的研读一下。Spring的初衷:1、JAVA EE开发应该更加简单。2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。3、为JavaBean提供了一个更好的应用配置框架。4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。5、尽量减少不必要的异常捕捉。6、使应用程序更加容易测试。Spring的目标:1、可以令人方便愉快的使用Spring。2、应用程序代码并不依赖于Spring APIs。3、Spring不和现有的解决方案竞争,而是致力于将它们融合在一起。Spring的基本组成:1、最完善的轻量级核心框架。2、通用的事务管理抽象层。3、JDBC抽象层。4、集成了Toplink, Hibernate, JDO, and iBATIS SQL Maps。5、AOP功能。6、灵活的MVC Web应用框架。
收起全文
精华内容
下载资源
问答
  • Spring框架介绍及使用

    万次阅读 多人点赞 2018-03-17 10:49:54
    Spring框架—控制反转(IOC) 1 Spring框架概述 1.1 什么是Spring 1.2 Spring的优点 1.3 Spring的体系结构 2 入门案例:(IoC) 2.1导入jar包 2.2目标类 2.3 配置文件 2.4测试 3 入门案例:DI 3.1 目标类...

    Spring框架—控制反转(IOC)

    1 Spring框架概述

    1.1 什么是Spring

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

    1.2 Spring的优点
    • 方便解耦,简化开发 (高内聚低耦合)
      Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
      spring工厂是用于生成bean
    • AOP编程的支持
      Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
    • 声明式事务的支持
      只需要通过配置就可以完成对事务的管理,而无需手动编程
    • 方便程序的测试
      Spring对Junit4支持,可以通过注解方便的测试Spring程序
    • 方便集成各种优秀框架
      Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
    • 降低JavaEE API的使用难度
      Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
    1.3 Spring的体系结构

    这里写图片描述

    2 入门案例:(IoC)

    2.1导入jar包
    • 4 + 1 : 4个核心(beans、core、context、expression) + 1个依赖(commons-loggins…jar)
      这里写图片描述
      这里写图片描述
    2.2目标类
    • 提供UserService接口和实现类
    • 获得UserService实现类的实例
      之前开发中,直接new一个对象即可。学习spring之后,将由Spring创建对象实例–> IoC 控制反转(Inverse of Control)
      之后需要实例对象时,从spring工厂(容器)中获得,需要将实现类的全限定名称配置到xml文件中
    public interface UserService {
    	public void addUser();
    }
    public class UserServiceImpl implements UserService {
    	@Override
    	public void addUser() {
    		System.out.println("a_ico add user");
    	}
    }
    
    2.3 配置文件
    • 位置:任意,开发中一般在classpath下(src)
    • 名称:任意,开发中常用applicationContext.xml
    • 内容:添加schema约束
      约束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\ xsd-config.html
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    	<!-- 配置service 
    		<bean> 配置需要创建的对象
    			id :用于之后从spring容器获得实例时使用的
    			class :需要创建实例的全限定类名
    	-->
    	<bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>
    </beans>
    
    2.4测试
       @Test
    	public void demo02(){
    		//从spring容器获得
    		//1 获得容器
    		String xmlPath = "com/itheima/a_ioc/beans.xml";
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    		//2获得内容 --不需要自己new,都是从spring容器获得
    		UserService userService = (UserService) applicationContext.getBean("userServiceId");
    		userService.addUser();	
    

    3 入门案例:DI

    • 例如:
      class BookServiceImpl{
          //之前开发:接口 = 实现类  (service和dao耦合)
      	//private BookDao bookDao = new BookDaoImpl();
      	//spring之后 (解耦:service实现类使用dao接口,不知道具体的实现类)
      	private BookDao bookDao;
      	setter方法
      

    }
    模拟spring执行过程
    创建service实例:BookService bookService = new BookServiceImpl() -->IoC
    创建dao实例:BookDao bookDao = new BookDaoImple() -->IoC
    将dao设置给service:bookService.setBookDao(bookDao); -->DI

    ##### 3.1 目标类
    - 创建BookService接口和实现类
    - 创建BookDao接口和实现类
    - 将dao和service配置 xml文件
    - 使用api测试
    ##### 3.2 dao
    ```java
    public interface BookDao {
      public void save();
    }
    public class BookDaoImpl implements BookDao {
    
      @Override
      public void save() {
      	System.out.println("di  add book");
      }
    }
    
    3.3 service
    public interface BookService {
    
    	public abstract void addBook();
    
    }
    public class BookServiceImpl implements BookService {
    	
    	// 方式1:之前,接口=实现类
    //	private BookDao bookDao = new BookDaoImpl();
    	// 方式2:接口 + setter
    	private BookDao bookDao;
    	public void setBookDao(BookDao bookDao) {
    		this.bookDao = bookDao;
    	}
    	
    	@Override
    	public void addBook(){
    		this.bookDao.save();
    	}
    
    }
    
    3.4 配置文件
    <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">
    	<!-- 
    	模拟spring执行过程
    		创建service实例:BookService bookService = new BookServiceImpl()	IoC  <bean>
    		创建dao实例:BookDao bookDao = new BookDaoImpl()			IoC
    		将dao设置给service:bookService.setBookDao(bookDao);		DI   <property>
    		
    		<property> 用于进行属性注入
    			name: bean的属性名,通过setter方法获得
    				setBookDao ##> BookDao  ##> bookDao
    			ref :另一个bean的id值的引用
    	 -->
    
    	<!-- 创建service -->
    	<bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
    		<property name="bookDao" ref="bookDaoId"></property>
    	</bean>
    	
    	<!-- 创建dao实例 -->
    	<bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
    	
    
    </beans>
    
    3.5 测试
    	@Test
    	public void demo01(){
    		//从spring容器获得
    		String xmlPath = "com/itheima/b_di/beans.xml";
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    		BookService bookService = (BookService) applicationContext.getBean("bookServiceId");	
    		bookService.addBook();
    	}
    

    4 依赖注入装配Bean 基于xml

    4.1属性依赖注入
    • 依赖注入方式:手动装配 和 自动装配
      • 手动装配:一般进行配置信息都采用手动
        基于xml装配:构造方法、setter方法
      • 基于注解装配:
    4.1.1 构造方法

    目标类

    public class User {
    	
    	private Integer uid;
    	private String username;
    	private Integer age;
    	
    	public User(Integer uid, String username) {
    		super();
    		this.uid = uid;
    		this.username = username;
    	}
    	
    	public User(String username, Integer age) {
    		super();
    		this.username = username;
    		this.age = age;
    	}
    	
    

    spring配置

    	<!-- 构造方法注入 
    		* <constructor-arg> 用于配置构造方法一个参数argument
    			name :参数的名称
    			value:设置普通数据
    			ref:引用数据,一般是另一个bean id值
    			
    			index :参数的索引号,从0开始 。如果只有索引,匹配到了多个构造方法时,默认使用第一个。
    			type :确定参数类型
    		例如:使用名称name
    			<constructor-arg name="username" value="jack"></constructor-arg>
    			<constructor-arg name="age" value="18"></constructor-arg>
    		例如2:【类型type 和  索引 index】
    			<constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
    			<constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
    	-->
    	<bean id="userId" class="com.itheima.f_xml.a_constructor.User" >
    		<constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
    		<constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
    	</bean>
    
    4.1.2 setter方法
    <!-- setter方法注入 
    		* 普通数据 
    			<property name="" value="值">
    			等效
    			<property name="">
    				<value>* 引用数据
    			<property name="" ref="另一个bean">
    			等效
    			<property name="">
    				<ref bean="另一个bean"/>
    	
    	-->
    	<bean id="personId" class="com.itheima.f_xml.b_setter.Person">
    		<property name="pname" value="阳志"></property>
    		<property name="age">
    			<value>1234</value>
    		</property>
    		
    		<property name="homeAddr" ref="homeAddrId"></property>
    		<property name="companyAddr">
    			<ref bean="companyAddrId"/>
    		</property>
    	</bean>
    	
    	<bean id="homeAddrId" class="com.itheima.f_xml.b_setter.Address">
    		<property name="addr" value="阜南"></property>
    		<property name="tel" value="911"></property>
    	</bean>
    	<bean id="companyAddrId" class="com.itheima.f_xml.b_setter.Address">
    		<property name="addr" value="北京八宝山"></property>
    		<property name="tel" value="120"></property>
    	</bean>
    
    4.2 集合依赖注入
    <!-- 
    		集合的注入都是给<property>添加子标签
    			数组:<array>
    			List:<list>
    			Set:<set>
    			Map:<map> ,map存放k/v 键值对,使用<entry>描述
    			Properties:<props>  <prop key=""></prop>  【】
    			
    		普通数据:<value>
    		引用数据:<ref>
    	-->
    	<bean id="collDataId" class="com.itheima.f_xml.e_coll.CollData" >
    		<property name="arrayData">
    			<array>
    				<value>DS</value>
    				<value>DZD</value>
    				<value>屌丝</value>
    				<value>屌中屌</value>
    			</array>
    		</property>
    		
    		<property name="listData">
    			<list>
    				<value>于嵩楠</value>
    				<value>曾卫</value>
    				<value>杨煜</value>
    				<value>曾小贤</value>
    			</list>
    		</property>
    		
    		<property name="setData">
    			<set>
    				<value>停封</value>
    				<value>薄纸</value>
    				<value>关系</value>
    			</set>
    		</property>
    		
    		<property name="mapData">
    			<map>
    				<entry key="jack" value="杰克"></entry>
    				<entry>
    					<key><value>rose</value></key>
    					<value>肉丝</value>
    				</entry>
    			</map>
    		</property>
    		
    		<property name="propsData">
    			<props>
    				<prop key="高富帅"></prop>
    				<prop key="白富美"></prop>
    				<prop key="男屌丝"></prop>
    			</props>
    		</property>
    	</bean>
    

    5 依赖注入装配Bean 基于注解

    • 注解:就是一个类,使用@注解名称
    • 开发中:使用注解 取代 xml配置文件。
      1.@Component取代<bean class="">
      @Component("id") 取代 <bean id="" class="">
      2.web开发,提供3个@Component注解衍生注解(功能一样)取代
      @Repository :dao层
      @Service:service层
      @Controller:web层
      3.依赖注入,给私有字段设值,也可以给setter方法设值
      • 普通值:@Value(" ")
      • 引用值:
        方式1:按照【类型】注入 @Autowired 方式2:按照【名称】注入1 @Autowired @Qualifier("名称") 方式3:按照【名称】注入2 @Resource("名称")
        4.生命周期
        初始化:@PostConstruct 销毁:@PreDestroy
        5.作用域
        @Scope("prototype") 多例
        注解使用前提,添加命名空间,让spring扫描含有注解类
      
      <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.xsd
         					   http://www.springframework.org/schema/context 
         					   http://www.springframework.org/schema/context/spring-context.xsd">
      <!-- 组件扫描,扫描含有注解的类 -->
      <context:component-scan base-package="com.itheima.g_annotation.a_ioc"></context:component-scan>
      
    ```
    

    Spring框架—面向切面编程(AOP)

    1 什么是AOP

    • 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
    • AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
    • 经典应用:事务管理、性能监视、安全检查、缓存 、日志等
    • Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
    • AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入

    2 AOP实现原理

    • aop底层将采用代理机制进行实现。
    • 接口 + 实现类 :spring采用 jdk 的动态代理Proxy。
    • 实现类:spring 采用 cglib字节码增强。

    3 AOP术语【掌握】

    1.target:目标类,需要被代理的类。例如:UserService
    2.Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
    3.PointCut 切入点:已经被增强的连接点。例如:addUser()
    4.advice 通知/增强,增强代码。例如:after、before
    5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
    6.proxy 代理类
    7. Aspect(切面): 是切入点pointcut和通知advice的结合
    一个线是一个特殊的面。
    一个切入点和一个通知,组成成一个特殊的面。
    这里写图片描述

    4 AOP实现方式

    4.1手动方式

    4.1.1JDK动态代理
    • JDK动态代理 对“装饰者”设计模式 简化。使用前提:必须有接口

    1.目标类:接口 + 实现类

    public interface UserService {
    	public void addUser();
    	public void updateUser();
    	public void deleteUser();
    }
    

    2.切面类:用于存通知 MyAspect

    public class MyAspect {	
    	public void before(){
    		System.out.println("鸡首");
    	}	
    	public void after(){
    		System.out.println("牛后");
    	}
    }
    

    3.工厂类:编写工厂生成代理

    public class MyBeanFactory {
    	
    	public static UserService createService(){
    		//1 目标类
    		final UserService userService = new UserServiceImpl();
    		//2切面类
    		final MyAspect myAspect = new MyAspect();
    		/* 3 代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面
    		 * 	Proxy.newProxyInstance
    		 * 		参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。
    		 * 			一般情况:当前类.class.getClassLoader();
    		 * 					目标类实例.getClass().get...
    		 * 		参数2:Class[] interfaces 代理类需要实现的所有接口
    		 * 			方式1:目标类实例.getClass().getInterfaces()  ;注意:只能获得自己接口,不能获得父元素接口
    		 * 			方式2:new Class[]{UserService.class}   
    		 * 			例如:jdbc 驱动  --> DriverManager  获得接口 Connection
    		 * 		参数3:InvocationHandler  处理类,接口,必须进行实现类,一般采用匿名内部
    		 * 			提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke
    		 * 				参数31:Object proxy :代理对象
    		 * 				参数32:Method method : 代理对象当前执行的方法的描述对象(反射)
    		 * 					执行方法名:method.getName()
    		 * 					执行方法:method.invoke(对象,实际参数)
    		 * 				参数33:Object[] args :方法实际参数
    		 * 
    		 */
    		UserService proxService = (UserService)Proxy.newProxyInstance(
    								MyBeanFactory.class.getClassLoader(), 
    								userService.getClass().getInterfaces(), 
    								new InvocationHandler() {
    									
    									@Override
    									public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    										
    										//前执行
    										myAspect.before();
    										
    										//执行目标类的方法
    										Object obj = method.invoke(userService, args);
    										
    										//后执行
    										myAspect.after();
    										
    										return obj;
    									}
    								});
    		
    		return proxService;
    	}
    
    }
    

    4.测试

    @Test
    	public void demo01(){
    		UserService userService = MyBeanFactory.createService();
    		userService.addUser();
    		userService.updateUser();
    		userService.deleteUser();
    	}
    
    4.1.2 CGLIB字节码增强
    • 没有接口,只有实现类。
    • 采用字节码增强框架 cglib,在运行时 创建目标类的子类,从而对目标类进行增强。

    工厂类

    public class MyBeanFactory {
    	
    	public static UserServiceImpl createService(){
    		//1 目标类
    		final UserServiceImpl userService = new UserServiceImpl();
    		//2切面类
    		final MyAspect myAspect = new MyAspect();
    		// 3.代理类 ,采用cglib,底层创建目标类的子类
    		//3.1 核心类
    		Enhancer enhancer = new Enhancer();
    		//3.2 确定父类
    		enhancer.setSuperclass(userService.getClass());
    		/* 3.3 设置回调函数 , MethodInterceptor接口 等效 jdk InvocationHandler接口
    		 * 	intercept() 等效 jdk  invoke()
    		 * 		参数1、参数2、参数3:以invoke一样
    		 * 		参数4:methodProxy 方法的代理
    		 * 		
    		 * 
    		 */
    		enhancer.setCallback(new MethodInterceptor(){
    
    			@Override
    			public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    				
    				//前
    				myAspect.before();
    				
    				//执行目标类的方法
    				Object obj = method.invoke(userService, args);
    				// * 执行代理类的父类 ,执行目标类 (目标类和代理类 父子关系)
    				methodProxy.invokeSuper(proxy, args);
    				
    				//后
    				myAspect.after();
    				
    				return obj;
    			}
    		});
    		//3.4 创建代理
    		UserServiceImpl proxService = (UserServiceImpl) enhancer.create();
    		
    		return proxService;
    	}
    
    }
    

    4.2半自动

    • 让spring 创建代理对象,从spring容器中手动的获取代理对象
    4.2.1目标类
    public interface UserService {
    	public void addUser();
    	public void updateUser();
    	public void deleteUser();
    }
    
    4.2.2切面类
    /**
     * 切面类中确定通知,需要实现不同接口,接口就是规范,从而就确定方法名称。
     * * 采用“环绕通知” MethodInterceptor
     *
     */
    public class MyAspect implements MethodInterceptor {
    
    	@Override
    	public Object invoke(MethodInvocation mi) throws Throwable {
    		
    		System.out.println("前3");
    		
    		//手动执行目标方法
    		Object obj = mi.proceed();
    		
    		System.out.println("后3");
    		return obj;
    	}
    }
    
    4.2.3Spring 配置
    <!-- 1 创建目标类 -->
    	<bean id="userServiceId" class="com.itheima.b_factory_bean.UserServiceImpl"></bean>
    	<!-- 2 创建切面类 -->
    	<bean id="myAspectId" class="com.itheima.b_factory_bean.MyAspect"></bean>
    
    	<!-- 3 创建代理类 
    		* 使用工厂bean FactoryBean ,底层调用 getObject() 返回特殊bean
    		* ProxyFactoryBean 用于创建代理工厂bean,生成特殊代理对象
    			interfaces : 确定接口们
    				通过<array>可以设置多个值
    				只有一个值时,value=""
    			target : 确定目标类
    			interceptorNames : 通知 切面类的名称,类型String[],如果设置一个值 value=""
    			optimize :强制使用cglib
    				<property name="optimize" value="true"></property>
    		底层机制
    			如果目标类有接口,采用jdk动态代理
    			如果没有接口,采用cglib 字节码增强
    			如果声明 optimize = true ,无论是否有接口,都采用cglib
    		
    	-->
    	<bean id="proxyServiceId" class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="interfaces" value="com.itheima.b_factory_bean.UserService"></property>
    		<property name="target" ref="userServiceId"></property>
    		<property name="interceptorNames" value="myAspectId"></property>
    	</bean>
    
    4.2.4 测试
    	@Test
    	public void demo01(){
    		String xmlPath = "com/itheima/b_factory_bean/beans.xml";
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    		
    		//获得代理类
    		UserService userService = (UserService) applicationContext.getBean("proxyServiceId");
    		userService.addUser();
    		userService.updateUser();
    		userService.deleteUser();
    	}
    

    4.3全自动

    • 从spring容器获得目标类,如果配置aop,spring将自动生成代理。
    4.3.1 Spring配置
    <?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:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           					   http://www.springframework.org/schema/beans/spring-beans.xsd
           					   http://www.springframework.org/schema/aop 
           					   http://www.springframework.org/schema/aop/spring-aop.xsd">
    	<!-- 1 创建目标类 -->
    	<bean id="userServiceId" class="com.itheima.c_spring_aop.UserServiceImpl"></bean>
    	<!-- 2 创建切面类(通知) -->
    	<bean id="myAspectId" class="com.itheima.c_spring_aop.MyAspect"></bean>
    	<!-- 3 aop编程 
    		3.1 导入命名空间
    		3.2 使用 <aop:config>进行配置
    				proxy-target-class="true" 声明时使用cglib代理
    			<aop:pointcut> 切入点 ,从目标对象获得具体方法
    			<aop:advisor> 特殊的切面,只有一个通知 和 一个切入点
    				advice-ref 通知引用
    				pointcut-ref 切入点引用
    		3.3 切入点表达式
    			execution(* com.itheima.c_spring_aop.*.*(..))
    			选择方法         返回值任意   包             类名任意   方法名任意   参数任意
    		
    	-->
    	<aop:config proxy-target-class="true">
    		<aop:pointcut expression="execution(* com.itheima.c_spring_aop.*.*(..))" id="myPointCut"/>
    		<aop:advisor advice-ref="myAspectId" pointcut-ref="myPointCut"/>
    	</aop:config>
    </beans>
    
    4.3.2 测试
    	@Test
    	public void demo01(){
    		String xmlPath = "com/itheima/c_spring_aop/beans.xml";
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    		
    		//获得目标类
    		UserService userService = (UserService) applicationContext.getBean("userServiceId");
    		userService.addUser();
    		userService.updateUser();
    		userService.deleteUser();
    	}
    
    展开全文
  • Spring框架

    千次阅读 2021-04-01 08:46:05
    spring框架 Spring概述 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。 Spring框架的7个模块:Spring AOP、Spring ORM、...

    spring框架

    Spring概述

    Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。
    Spring框架的7个模块:Spring AOP、Spring ORM、Spring Web、Spring Web MVC、Spring DAO、Spring Contex、Spring Core
    组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
    

    核心容器:

    核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
    

    实例化Spring 容器

    1.新建一个web项目spring-demo
    2.导入spring核心包
    3.将applicationContext.xml文件导入src下,新建一个包com.spring.demo
    4.导入JUnit,项目右键点击properties---->java build path---->Libraries----->add library----->Junit4—>next—>finish
    5.新建一个Junit Test Case类,
    6.实例化容器,获取applicationContext配置文件地址,创建ApplicationContext对象传7.入获取的配置地址,控制台打印出实例化容器信息
    8.控制台打印出信息下面信息说明容器实例化成功

    利用Spring容器创建javaBean对象

    1.用构造器实例化`

    <beanid="calendarObj1"class="java.util.GregorianCalendar"></bean>

    2.在TestCase调用getBean获取配置文件bean,创建bean对象实例

    Calendar cr = ac.getBean("calendarObj1",Calendar.class);

    使用静态工厂方法实例化

    1.在配置文件中添加

    <bean id="calendarObj2" class="java.util.GregorianCalendar" factory-method="getInstance"></bean>```
    

    2.在TestCase测试类test方法中添加

    Calendar cr2 = ac.getBean("calendarObj2",Calendar.class);
    
           System.out.println("calendarObj2:"+cr2);

    实例工厂实例化

    1.在applicationContext.xml配置文件中添加

    
    
    <!-- 实例工厂实例化 -->
            <bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>
            <bean id="dateObj" factory-bean="calendarObj3" factory-method="getTime"></bean>

    2.在测试类test方法增加

    Date date = ac.getBean("dateObj",Date.class);
    
        System.out.println("calendarObj3:"+date);

    3.junit测试,控制输出。
    实例化成功

    展开全文
  • Spring框架总结【无比详细】

    万次阅读 多人点赞 2018-08-07 15:33:17
    以下内容是我在初学spring时候做的笔记,当时是把比较放在了备忘录里面,如今把笔记重整到csdn上,为了复习也为了分析给大家,笔记写的算比较完整,回看自己做的还是有点羞涩。如有错误之处,欢迎指正,当我日后更...

    以下内容是我在初学spring时候做的笔记,当时是把比较放在了备忘录里面,如今把笔记重整到csdn上,为了复习也为了分析给大家,笔记写的算比较完整,回看自己做的还是有点羞涩。如有错误之处,欢迎指正,当我日后更强大的时候,我会不断的对内容进行补充和完善。当然学习也就是这么一个过程,学习-实践-总结-实践-总结...   转载请申明原文地址,希望大家支持,谢谢。

     

    1、IOC和DI

    IOC: 控制反转
    即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建(spring)

    DI:  Dependency Injection  依赖注入
    spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件.
    实现IOC思想需要DI做支持
    注入方式:   1.set方式注入    2.构造方法注入   3.字段注入
    注入类型:   1.值类型注入      2.引用类型注入

     

    好处: 

    1.降低组件之间的耦合度,实现软件各层之间的解耦.


    2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播

    
3.容器提供单例模式支持,开发人员不需要自己编写实现代码.

    
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能


    5.容器提供众多的辅佐类,使这些类可以加快应用的开发.如jdbcTemplate HibernateTemplate
     

     

    2.applicationContext & BeanFactory区别

    BeanFactory接口
    (1) spring的原始接口,针对原始接口的实现类功能较为单一
    (2)BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象


    ApplicationContext接口
    (1)每次容器启动时就会创建容器中配置的所有对象
    (2)提供了更多功能
    (3)从类路径下加载配置文件: ClassPathXmlApplicationContext
    从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication

     

    3.spring配置详解

    3.1、元素属性

        bean元素:使用该元素描述需要spring容器管理对象
        name属性:给被管理的对象起个名字,获得对象时getBean("name值")
        class属性:被管理对象的完整类名
        id属性:与name属性一模一样,名称不可重复,不能使用特殊字符

     

    name和id之间的一些注意点:
    1、配置两个相同的 id 或者 name 都不能通过。
    2、如果既配置了 id ,也配置了 name ,则两个都生效。如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
    3、如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 相同的时候, 则两个冲突,配置文件生效。
          如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 不相同的时候, 则两个不冲突,都能够生效。

     

    3.2、bean元素进阶(  scope属性   生命周期属性)—————单例多例


    (1)scope属性
        (1)singleton   默认值   
    单例对象   :被标识为单例的对象在spring容器中只会存在一个实例
        (2)prototype    
    多例原型:被标识为多例的对象,每次在获得才会被创建,每次创建都是新的对象
        (3)request
    Web环境下,对象与request生命周期一致    
        (4)session
    Web环境下,对象与session生命周期一致
    总结:绝大多数情况下,使用单例singleton(默认值),但是在与struts整合时候,务必要用prototype多例,因为struts2在每次请求都会创建一个新的Action,若为单例,在多请求情况下,每个请求找找spring拿的都是同一个action。

     

    (2)生命周期属性(了解)———初始化和销毁
        (1)配置一个方法作为生命周期初始化方法,spring会在对象创建之后立刻调用 init-method
        (2)配置一个方法作为生命周期的销毁方法,spring容器在关闭并销毁所有容器中的对象之前调用destory-method
        <bean init-method=“init”  destory-method=“destory”></bean>        对应注解为@PostConstruct

        <bean name=“hello” class=“完整类名”></bean>                                 对应注解为@PreDestory


    (3)模块化配置,即分模块配置(导入其他spring配置文件)
    <beans>
        <import resource = “spring配置文件的全路径名” />
    </beans>

     

    3.3、spring三种对象的创建方式

    (1)空参数构造(重要)

    (2)静态工厂创建(调用静态方法创建)
    调用UserFactory类的静态createUser方法创建名为user的对象,放入容器
     

    <bean name="user" class="cn.itcats.UserFactory" factory-method="createUser"></bean>


    (3)实例工厂创建(调用非静态方法创建)——需要配置两个bean,因为无法通过类名调用非静态方法
     

    <bean name="user2" factory-bean="userFactory" factory-method="createUser"></bean>
    
    <bean name=“userFactory” class=“cn.itcats.UserFactory”></bean>
    

     

    3.4、spring注入方式

    (1)set方式注入(重点)————值类型用value注入    引用类型用ref注入

     

    (2)构造方法注入

     

    函数注入
    (3)p名称空间注入———实际上set注入,spring特有,为了简化<property>写法

       1、applicationContext.xml中<beans>标签头部导入p命名空间

    xmlns:p="http://www.springframework.org/schema/p"

       2、书写格式:值类型注入——  p:属性名="值"      引用类型注入——  p:属性名-ref="引用的<bean> name属性"

           把Run类中的name属性值设置为haha,age属性设置为20,引用属性hello引用<bean name="hello" class="..."></bean>

    <bean name="run2" class="cn.itcats.thread.Run" p:name="haha" p:age="20" p:hello-ref="hello"></bean>

     

     (4)spel注入: spring Expression Language spring表达式语言

    <bean name="runSpel" class="cn.itcats.thread.Run">
        <!-- 取bean标签中name为"user"中property为"name"中的value值 --!>
        <property name="name" value="#{user.name}"></property>
    </bean>

    SpEL特性:(1)、使用Bean的ID来引用Bean;(2)、调用方法和访问对象的属性;(3)、对值进行算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作

    关于spel   https://www.cnblogs.com/goodcheap/p/6490896.html

     

    复杂类型注入

        1.array数组的注入

     

    2.list集合的注入

     

       3.map集合的注入

     

        4.properties的注入

     

    4、防止创建多个applicationContext取值/并指定记载spring配置文件的位置——web.xml

       1、需要导入包spring-web
       2、在web.xml中配置监听器

     

    5、使用注解方式代替配置文件(官方推荐使用注解)

         1.在applicationContext.xml中书写指定扫描注解

       

          2.在类中书写Component

    注意:假如不写括号内的值(即name或id),默认使用类名首字母小写作为搜索,为什么意思呢?

    比如Student类中使用了@Component   没有书写括号和值,那么默认搜索id或name为student。

     

         3.指定对象的作用范围Scope

             声明Student类对象为多例       下面是对singleton和prototype的一些补充

    • singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。

    • prototype作用域:prototype作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。对于具有prototype作用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源。简单的说:

    • singleton 只有一个实例,也即是单例模式

    • prototype访问一次创建一个实例,相当于new。

     

        4.值类型的注入

                                                                                           实际通过反射field赋值

     

                                                                                           实际通过set方式赋值

     

         5.引用类型的注入

    面试题: @AutoWired和@Resource的区别?

    @AutoWired默认以类型进行查找,@Resource默认以名称进行查找

    @AutoWired(required=false)    +   @Qualifier("user")    ==   @Resource(name="user")

    其中@Resource注解是jdk1.6后才有的

     

     

        6.创建与销毁方法

     

         7.spring整合junit测试(spring创建容器)

         @RunWith(SpringJUnit4ClassRunner.class)
         @ContextConfiguration("classpath:applicationContext.xml")    

     

        6、spring中AOP名词解释

    JoinPoint(连接点):目标对象中,所有可以增强的方法,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点。


    Pointcut(切入点):目标对象中,已经被增强的方法。调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法。


    Advice(通知/增强) :增强方法的代码、想要的功能。


    Target(目标对象):被代理对象,被通知的对象,被增强的类对象。


    Weaving(织入):将通知应用到连接点形成切入点的过程


    Proxy(代理):将通知织入到目标对象之后形成的代理对象


    aspect(切面):切入点+通知————通知(Advice)说明了干什么的内容(即方法体代码)和什么时候干(什么时候通过方法名中的before,after,around等就能知道),二切入点说明了在哪干(指定到底是哪个方法),切点表达式等定义。

    虽然现在都用Maven项目构建,但是不能忘记,使用aop需要用到的包:spring-aop + spring-aspects     + springsource.org.aopalliance  + springsource.org.aspectj.weaver 

    关于AOP看一个小例子:

     1、准备目标对象(被代理对象,被通知的对象,被增强的类对象)

     

          2、准备通知(被增强方法的代码,想要实现功能的方法代码)

     

           3、配置 applicationContext.xml
                1.导入aop(约束)命名空间
                2.配置目标对象
                3.配置通知对象
                4.配置将通知织入目标对象

     

            4、测试

    总结:通知的几种类型
        1.前置通知———目标方法运行之前调用
        2.后置通知———目标方法运行之后调用(如果出现异常不调用)
        3.环绕通知———目标方法之前和之后都调用
        4.异常拦截通知———如果出现异常,就会调用
        5.后置通知———目标方法运行之后调用(无论是否出现异常都会调用)

     

         7、spring中的aop使用注解配置

           1、applicationContext.xml中配置目标对象,通知对象,开启使用注解完成织入

     

         2、@Aspect注解代表该类是个通知类,书写切点表达式@Pointcut("execution(返回值 全类名.方法名(参数))")

    注意环绕通知需要这么写:

    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    	    //环绕方法执行前
                //proceedingJoinPoint.proceed();表示对拦截的方法进行放行
                //若注释proceedingJoinPoint.proceed()则不会执行被AOP匹配的方法
    			proceedingJoinPoint.proceed();
                //环绕方法执行后
    	}

    AOP注解解析:

    @Before 前置通知(Before advice) :在某连接点(JoinPoint)——核心代码(类或者方法)之前执行的通知,但这个通知不能阻止连接点前的执行。为啥不能阻止线程进入核心代码呢?因为@Before注解的方法入参不能传ProceedingJoinPoint,而只能传入JoinPoint。要知道从aop走到核心代码就是通过调用ProceedingJionPoint的proceed()方法。而JoinPoint没有这个方法。 
    这里牵扯区别这两个类:Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理链执行的方法。暴露出这个方法,就能支持 aop:around 这种切面(而其他的几种切面只需要用到JoinPoint,这跟切面类型有关), 能决定是否走代理链还是走自己拦截的其他逻辑。建议看一下 JdkDynamicAopProxy的invoke方法,了解一下代理链的执行原理。这样你就能明白 proceed方法的重要性。

    @After 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

    @AfterReturning 返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。

    @Around 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。这时aop的最重要的,最常用的注解。用这个注解的方法入参传的是ProceedingJionPoint pjp,可以决定当前线程能否进入核心方法中——通过调用pjp.proceed();

    @AfterThrowing 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。

     

          8、spring整合jdbc

          spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术  ————JDBCTemplate JDBC模板对象,而JdbcDaoSupport则对JdbcTemplate进行了封装,所以要操作JdbcTemplate,或只需要继承JdbcDaoSupport即可。

          

     

             依赖关系配置:

     

                   测试:

                     

         9、spring中的aop事务

    事务的四大基本特性:

    事物的概述

    原子性(Atomicity

      原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    一致性(Consistency

      一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

      拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管AB之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

    隔离性(Isolation

      隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

      即要达到这么一种效果:对于任意两个并发的事务T1T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

      关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

    持久性(Durability

      持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

      例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

     

    关于事务的隔离级别我之前发布了一篇文章https://blog.csdn.net/itcats_cn/article/details/81487466

     

    spring中事务的分类:

    spring中事务可以分为编程式事务控制和声明式事务控制。

    编程式事务控制

           自己手动控制事务,就叫做编程式事务控制。

           Jdbc代码:

                  Conn.setAutoCommit(false);  // 设置手动控制事务

           Hibernate代码:

                  Session.beginTransaction();    // 开启一个事务

           【细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制】

           (比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)

     

    声明式事务控制

           Spring提供了对事务的管理, 这个就叫声明式事务管理。

           Spring提供了对事务控制的实现。用户如果想用Spring的声明式事务管理,只需要在配置文件中配置即可; 不想使用时直接移除配置。这个实现了对事务控制的最大程度的解耦

           Spring声明式事务管理,核心实现就是基于Aop

           【粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务。】

           (因为aop拦截的是方法。)

     

           Spring声明式事务管理器类:

                  Jdbc技术:DataSourceTransactionManager

                  Hibernate技术:HibernateTransactionManager

    有一点需要注意的:若为编程式事务控制,则开启事务后一定要手动释放(提交或回滚),否则长期占用内存,有可能报事务异常

     

    spring封装了事务管理的代码(打开,提交,回滚事务)
    事务操作对象,因为在不同平台,操作事务的代码各不相同.spring提供了一个接口
    ————— PlatformTransactionManager 接口
    ————— 在不同平台,实现不同的接口即可
    ————— 注意:在spring中玩事务管理.最为核心的对象就是TransactionManager对象

     

    spring管理事务的属性介绍
            (1)事务的隔离级别
            (2)是否只读
            (3)事务的传播行为
     

    配置事务的核心管理器,它封装了所有事务,依赖于连接池(DataSourceTransactionManager)

     

    xml中配置通知

    配置将通知织入目标

    10、spring中aop管理事务 注解使用步骤

    在需要管理的方法或者类中声明配置事务管理

    @Transactional(isolation=Isolation.REPEATABLE_READ,readOnly=false,propagation=Propagation.REQUIRED)

     

    展开全文
  • spring框架

    千次阅读 2016-03-01 19:42:32
    关于spring的说法错误的是(D) ...A.spring是一个轻量级Java EE的框架集合 B.spring的“依赖注入”模式的实现 C.使用spring可以实现声明事务 D.spring提供了AOP方式的日志系统 解析: Spring Fra
    关于spring的说法错误的是(D)
    A.spring是一个轻量级Java EE的框架集合                          B.spring的“依赖注入”模式的实现
    C.使用spring可以实现声明事务                                          D.spring提供了AOP方式的日志系统
    解析:
    Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,Spring中包含的关键特性:
    1.强大的基于JavaBeans的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
    2.一个可用于从applet到Java EE等不同运行环境的核心Bean工厂。
    数据库事务的一般化抽象层,允许声明式(Declarative)事务管理器,简化事务的划分使之与底层无关。
    3.内建的针对JTA和单个JDBC数据源的一般化策略,使Spring的事务支持不要求Java EE环境,这与一般的JTA或者EJB CMT相反。
    4.JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。再次利用JDBC时,你无需再写出另一个'终止'(finally)模块。并且面向JDBC的异常与Spring通用数据访问对象(Data Access Object)异常等级相一致。
    5.以资源容器,DAO实现和事务策略等形式与Hibernate,JDO和iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持,解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
    6.灵活的基于核心Spring功能的MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中间层可以轻易地结合于任何基于MVC框架的网页层,例如Struts、WebWork或Tapestry。
    7.提供诸如事务管理等服务的面向方面编程框架。

    另外,Spring并没有提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。
    展开全文
  • Spring入门第一讲——Spring框架的快速入门

    万次阅读 多人点赞 2017-04-08 00:27:34
    Spring是一个开源框架Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架Spring是一个开源框架Spring是于2003年...
  • 什么是spring框架spring框架究竟有什么用呢?我们可以用spring框架来做些什么呢?让我们来具体了解一下,以及经常所说的IOC和AOP是一种怎样的思想,到底是怎么实现这些思想的!
  • spring框架-认识spring框架(一)

    万次阅读 2019-02-12 20:56:41
    1、Spring定义 2、为什么使用Spring 3、控制反转(IOC) 4、DL (依赖查找) 5、DI(依赖注入) 6、面向切面AOP
  • Spring框架|JdbcTemplate介绍

    万次阅读 多人点赞 2020-02-02 18:42:47
    文章目录一、JdbcTemplate 概述二、创建对象的源码分析三、JdbcTemplate操作数据库 ...而真正的JDBCtemplete类,是Spring框架为我们写好的。 它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单...
  • spring框架学习(一)

    万次阅读 多人点赞 2014-03-07 22:51:19
    1,什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。     2,架构...
  • spring框架是一个轻量级的Java开发框架,为应用开发提供平台。 spring框架主要包括7个模块 Spring AOP 面向切面编程 Spring ORM Hibernate|mybatis|JDO Spring Core 提供bean工厂 IOC Spring Dao JDBC支持 Spring ...
  • spring框架搭建

    千次阅读 2018-07-02 19:57:09
    目录 Spring框架的介绍... 1 1、spring框架的作用... 1 2、spring的优点... 2 Spring框架的搭建... 2 1.导包... 2 2.创建一个对象... 4 3.书写配置文件... 5 4.Spring框架的思想... 6 5.Spring工厂... 7 Spring...
  • Spring框架总结篇

    千次阅读 2020-02-05 17:00:28
    Spring框架总结篇,博客整理,系列介绍Spring框架
  • 简单来说的话,Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。  Spring是基于Java平台的,...Spring框架的核心功能适用于任何Java应用。在基于Java企业平台的上的大量Web应用中,积极的扩展和改

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 208,688
精华内容 83,475
关键字:

spring框架

spring 订阅