Spring核心概念

3 篇文章 0 订阅
2 篇文章 0 订阅
                                                                        学习知识要学习该知识点的概念是什么好处是什么应用在哪些方面与其类似事物的区别是什么
            初识Spring
企业级应用:是指那些为商业组织、大型企业而创建并部署的解决方案及应用。这些大型企业级应用的结构复杂,涉及的外部资源众多,事务密集,数据规模大,用户数量多,有较强的安全性考虑和较高的性能要求。
Spring是于2003 年兴起的一个轻量级的Java 开源框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)   轻量级 开源框架。
Spring “绿草丛
Spring确实给人一种格外清新、爽朗的感觉,仿佛雨后的绿草丛,讨人喜欢有蕴藏着勃勃生机。Spring是一个轻量级开源框架,它大大简化了Java企业级的开发,提供了强大稳定的功能。又没有带来额外的负担,让人们在使用它做每一件事情的时候都有得体和优雅的感觉。Spring有两个主要目标:一是让现有的技术更易于使用,二是促进良好的编程习惯(或者称为最佳实践)
Spring是一个全面的解决方案,但它坚持一个原则:
不重新发明轮子,已经有较好的解决方案的领域,绝不做重复性的实现。例如:对象持久化ORM,Spring只是对现有的JDBC、Hibernate等技术提供支持,使之更易于使用,而不是重新做一个实现。

                                 Spring核心概念
1:控制反转(Inversion of Control,IoC),也被称为依赖注入(Dependency Injection,DI)
用来减低程序代码之间的耦合度。
所谓控制反转,就是控制权发生了反转,UserBiz不再依靠自身的代码去获取所依赖的具体的Dao对象,而是把这一工作交给了第三方---UserDaoFactory
相对于“控制反转”,“依赖注入”的说法更容易理解一些,即由容器(如Spring)负责把组件所依赖的具体对象“注入”(赋值)给组件,从而避免组件之间以硬编码的方式耦合在一起
Spring会自动接管配置文件中Bean的创建和为属性赋值的工作
Spring为Bean属性赋值时是通过调用属性的setter方法实现的,这种做法被称为“设 值注入”
    
    
<bean id="" class="">
<property name="对应的setter方法名">
<value>Spring</value>
</property>
 
<!--也可写成这样-->
     <property name = "对应的setter方法名" value="spring"/ >
<!--
        value 属性用于注入基本数据类型以及字符串类型的值
        ref属性用于注入已经定义好的Bean
-->
</bean>
     
     
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
 
Object obj=ac.getBean("id值");//可以强转成你想要的类型
/*
ApplicationContext 是一个接口,负责读取Spring 配置文件,管理对象的加载、生成、维护Bean对象之间的关系,负责Bean对象的生命周期
除了 ClassPathXmlApplicationContext之外,FileSystemXml ApplicationContext也是
ApplicationContext接口的子类,也可以用于加载Spring配置文件
*/


Spring的核心机制是依赖注入
Struts的核心机制是拦截器

1spring原理 

      内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。  
      Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过  配置类达到的。  
      Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象)  
      要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。  
Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式), Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了Spring.

Spring AOP与IOC
一、 IoC(Inversion of control): 控制反转  
1、IoC:  
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系  
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean  
二、AOP(Aspect-Oriented Programming): 面向方面编程  
1、 代理的两种方式:  
静态代理:  
 针对每个具体类分别编写代理类;  
 针对一个接口编写一个代理类;  
动态代理:  
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

2、动态代理:

不用写代理类,虚拟机根据真实对象实现的接口产生一个类,通过类实例化一个动态代理,在实例化动态代理时将真实对象及装备注入到动态代理中,向客户端公开的是动态代理,当客户端调用动态代理方法时,动态代理根据类的反射得到真实对象的Method,调用装备的invoke方法,将动态代理、 Method、方法参数传与装备的invoke方法,invoke方法在唤method方法前或后做一些处理。     

             1、产生动态代理的类:

                            java.lang.refect.Proxy

             2、装备必须实现InvocationHandler接口实现invoke方法

3、反射

    什么是类的返射?

        通过类说明可以得到类的父类、实现的接口、内部类、构造函数、方法、属性并可以根据构造器实例化一个对象,唤起一个方法,取属性值,改属性值。如何得到一个类说明

                        Class cls=.class;

                        Class cls=对象.getClass();

                        Class.forName("类路径");

       如何得到一个方法并唤起它?

                        Class cls=.class;

                        Constructor cons=cls.getConstructor(new Class[]{String.class});

                        Object obj=cons.newInstance(new Object[]{"aaa"});

                        Method method=cls.getMethod("方法名",new Class[]{String.class,Integer.class});

                        method.invoke(obj,new Object[]{"aa",new Integer(1)}); 

4spring的三种注入方式是什么?

        setter

        interface

        constructor

5spring的核心接口及核类配置文件是什么?

        FactoryBean:工厂bean主要实现ioc/di

         ApplicationContext ac=new FileXmlApplicationContext("applicationContext.xml");

          Object obj=ac.getBean("id");

6、Spring框架20个功能7个模块,分别是Data Access/Integration(数据访问集成)、Web、AOP、Instrumentation(设备)、Messaging(消息发送)、Core Container(核心容器)、Test


4.1 核心容器

核心容器包含spring-core、spring-beans、spring-context、spring-context-support和spring-expression (Spring Expression Language,Spring表达式语音)这些模块。

spring-core和spring-beans构成了框架最基础的部分,包括控制反转和依赖注入功能。BeanFactory是工厂模式的一个很成熟的实现。

spring-context是基于spring-core和spring-beans构建的,它提供了一种以框架风格来访问对象的方式,类似于JNDI注册。ApplicationContext接口是spring-context的焦点。spring-context-support为集成第三方库(如定时器Quartz)提供支持。spring-expression提供了一种强大的表达式语言,可以在运行时查询和操作对象。

4.2 AOP和设备

spring-aop模块提供了一个AOP面向切面编程的实现。比如,允许开发者定义方法拦截器和切入点,以此来将业务逻辑和系统服务进行解耦。

spring-aspects模块提供与AspectJ的集成。

spring-instrument模块提供了在普通应用服务器中使用到的类设备支持和加载器实现。spring-instrument-tomcat模块包含了Spring的Tomcat设备代理。

4.3 消息发送

Spring 4包含了一个spring-messaging模块,它对Spring集成项目Message、MessageChannel和MessageHandler进行了重要的抽象,它是基于消息发送应用的基础。

4.4 数据访问/集成

数据访问/集成层包含JDBC(spring-jdbc)、ORM(spring-orm)、OXM(spring-oxm)、JMS(spring-jms)和事务(spring-tx)模块。

4.5 Web

Web层包含spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet模块。其中,spring-web提供了面向Web集成的基本特性,比如文件上传功能。Spring-webmvc模块包含了Spring的MVC和REST Web Service实现。Spring-webmvc-portlet模块提供了在Portlet环境下的MVC实现。

4.6 测试

Spring-test模块支持Spring组建JUnit和TestNG的单元测试和集成测试。

5 为何使用Spring?

Spring的IOC和AOP两大核心功能可以大大降低应用系统的耦合性、简化开发流程。

Spring框架技术可在不同层次上起作用,比如IOC管理普通的POJO对象、AOP增强了系统服务和其它组件(事务、MVC、JDBC、ORM和远程调用等)。Spring的一大特点就是基于接口变成,它是非侵入式的服务。用户端绑定接口使用JAVA EE服务,而非直接绑定服务,而且应用也可以使用不同的服务(Hibernate、MyBatis等)。我们可以根据自己的需要,使用Spring的一部分服务,而不必使用完整的Spring系列项目。

spring frame work

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

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

     Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

     Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

     Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

     Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

     Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

     Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。


2:Spring AOP
面向切面编程:(Aspect Oriented Programming)
是面向对象编程(Object Oriented Programming)的有益的补充
AOP的引入:
来源以一个典型的日志、异常处理、事务控制的业务处理方法,这部分的代码需要被重用和解耦,以免使业务变得更加复杂
我们希望无需编写显示的调用,在需要的时候,系统能够“自动”调用所需的功能,这正是AOP所要解决的问题。
面向切面编程,简单的说就是在不改变源程序的基础上为代码段增加新的功能,对代码段进行增强处理,他的设计思想来源于代理设计模式。(Proxy)
增强处理(Advice)类型:在原对象的fun()方法前后做增强处理,此外还有环绕增强,异常抛出增强,最终增强等类型
被标记为final的不能被注入通知,即不能增强处理
切入点(PointCut): 原对象的fun()方法
日志输出的代码直接嵌入在业务流程的代码中,不利于系统的扩展和维护,如何使用SpringAOP来实现日志输出,已解决这个问题
import java.lang.reflect.Method;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
//前置通知
public class LoggerBefore implements MethodBeforeAdvice {
    private static final Logger LOGGER=Logger.getLogger(LoggerBefore.class);
    //实现before()方法:有三个参数:被代理的目标方法、方法的参数、被代理的目标对象
    public void before(Method method, Object[] arguments, Object target)
        throws Throwable {
    LOGGER.info("调用"+target+"的"+method.getName()+"方法,"+"方法参数为:"+Arrays.toString(arguments));
    }
}  
//同理:要实现后置通知只需要实现AfterRturningAdvice接口
让后在ApplicationContent.xml 里配置相应的bean 即可
与AOP相关的配置都可以放在<aop:config></aop:config 标签中,<aop:config>有三个子标签
分别是
 <aop:aspect id="" order="" ref=""></aop:aspect>
order属性表示当有多个增强处理(通知:advice)同时作用于同一个连接点(切面)时,控制这些通知的执行顺序
ref表示封装这个切面的bean 的id名称
 <aop:pointcut  id=""  expression="" />  
expression属性表示切入点表达式
写法为execution(* phone.biz..*.*(..))

<aop:advisor id="" advice-ref="" pointcut="" order=""  pointcut-ref=""/> 
其中 pointcut属性里要写的内容与<aop:pointcut  id=""  expression="" />  里的expression要写的内容一致都是写切入点表达式
<aop:config></aop:config 标签中,这个子标签最常用,因为它结合了事务、通知和切面
<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes> 
        <tx:method name="get*" read-only="true" timeout="60"/> 
        <tx:method name="add*" propagation="REQUIRED" timeout="60"/> 
        <tx:method name="update*" propagation="REQUIRED" timeout="60"/> 
        <tx:method name="delete*" propagation="REQUIRED" timeout="60"/> 
    </tx:attributes> 
    </tx:advice> 
         <aop:config> 
                <aop:advisor 
                pointcut="execution(* phone.biz..*.*(..))" 
                advice-ref="txAdvice" /> <!--追根溯源 advice-ref指向的是一个类-->
         </aop:config>  
 
1.谈谈你对spring的理解
首先spring是一个开源的框架,Spring为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。
在Java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架。

Spring主要核心是:

(1).控制反转(IOC):以前传统的java开发模式中,当需要一个对象时,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。
控制反转是一种设计思想,这种思想的核心是说到控制权的转移,而依赖注入是一种技术(通过反射的技术达到),他们是有本质区别的
一个在于说一个在于如何做到,实际行动(举例:找女友:婚介所)
(2).依赖注入(DI):Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。
比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

(3).面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
其次.在Spring中,所有管理的对象都是JavaBean对象,而BeanFactory和ApplicationContext就是spring框架的两个IOC容器,现在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同时还进行更多的扩展。
补充:
AOP的概念: 简单的说就是在不改变源程序的基础上为代码段增加新的功能,
                         对代码段进行增强处理,来源于代理设计模式
AOP的好处: 无需编写显示的调用,在需要的时候,系统能够“自动”调用所需的功能
与OOP的区别: 在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,是OOP有益的扩充。
应用: 权限验证,事物控制,记录日志(比如编写前置增强和后置增强实现日志输出)、异常处理
private CategoryBiz categoyBiz ;
pubulic CategoryBiz  getCategoryBiz(){
 return categoryBiz ;
}
pubulic void setCategoryBiz(CategoryBiz  categoyBiz;){
 this.categoryBiz =categoyBiz;;
}

                                                            第二章:IoC和AOP使用扩展
在第一章我们使用Spring通过setter访问器实现了对属性的赋值,这种做法被称为设值注入。除此之外Spring还提供了通过构造方法赋值的能力,称为构造注入


@Autowired(自动装配) 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的?       我


经过一些代码的测试,我发现,Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。

例子:

@Autowired
private ExamUserMapper examUserMapper;  - ExamUserMapper是一个接口


1. spring先找类型为ExamUserMapper的bean

2. 如果存在且唯一,则OK;

3. 如果不唯一,在结果集里,寻找name为examUserMapper的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了


@Autowired也可以手动指定按照byName方式注入,使用@Qualifier标签,例如:
@Autowired () @Qualifier ( "baseDao" )

因为bean的name具有唯一性,理论上是byName会快一点,但spring默认使用byType的方式注入,让我很迷惑,确定不了哪一个真的快。具体到实际应用,感觉差别不大,就看大家的习惯

另注:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配; 

IMG_20170511_164826.jpg



 


加载注解定义的Bean  :导入命名空间:xmlns:context
<context:component-scan base-package="linjianhui"/>
使用注解实现声明式事务处理
<tx:annotation-driven transaction-manager="txManager" />
Spring是一个开源的轻量级应用框架,其核心思想是IoC(Inversion of Control)和AOP(Aspect Oriented Programming),其中: 1. IoC(控制反转):指将对象的创建和依赖关系的管理交给Spring来完成,即由容来控制对象的生命周期和依赖关系。通过IoC容,我们可以将对象之间的依赖关系从代码中分离出来,使得代码更加简洁、灵活、易于维护和扩展。 2. AOP(面向切面编程):指通过在程序中定义切面(Aspect)来实现对横切关注点(Cross-cutting Concerns)的管理。切面可以定义一些通用的行为,如日志记录、性能统计、安全控制等,然后将其应用到多个不同的对象中,从而实现代码的重用和统一管理。 除此之外,Spring还有一些其他的核心概念,如: 1. Bean:在Spring中,所有的对象都被称为Bean,Bean是Spring IoC容中的基本构建模块,它由容创建、组装和管理。 2. ApplicationContext:是Spring的IoC容的接口,它负责管理Bean的生命周期和依赖关系,并提供了一些高级功能,如事件传播、国际化、资源管理等。 3. Spring MVC:是Spring框架中的Web应用程序开发框架,它基于MVC(Model-View-Controller)架构模式,提供了一组组件和工具,使得开发Web应用程序更加容易和灵活。 总之,Spring核心概念包括IoC、AOP、Bean、ApplicationContext和Spring MVC等,这些概念Spring框架提供了强大的功能和灵活性,使得开发者可以更加方便地开发出高质量的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值