【实习第一周】spring入门

一、spring概述

spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IOC和AOP为内核,提供了展现层spring mvc和持久层spring jdbc以及业务层事物管理等众多的企业级应用技术,整合了开源第三方类库。spring提供了“一站式”选择,是因为spring贯穿展现层、业务层和持久层。

       spring特点:

       1. 全面和模块化的,有分层的体系结构。

       2.独立于各种应用服务器,基于spring框架的应用,可以真正实现write once, run anywhere

       3.DI机制降低了业务对象替换的复杂性。


spring体系结构

       

       核心容器:提供spring框架的基本功能,主要组件是beanfactory。使用IOC模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

      spring上下文:配置文件向spring框架提供上下文信息,包括企业服务,如JNDI、EJB、电子邮件等。

      AOP:该模块直接将面向切面的编程功能集成到spring框架中。所以可以很容易地使spring框架管理的任何对象支持AOP。

     spring dao:异常层次结构,管理异常处理和不同数据库供应商抛出的错误信息,简化了错误处理,极大地降低了需要编写的异常代码数量。

     ORM: spring框架插入了若干个ORM框架,提供了ORM的对象关系工具。

     web上下文: 建立在应用程序上下文模块之上,为基于web应用程序提供了上下文。

     MVC框架: 全功能构建web应用程序的MVC实现。

      1.spring核心容器和上下文

 spring以bean的方式组织和管理Java应用中的各个组件,组件之间的依赖关系松耦合,得益于DI。使用BeanFactory作为应用中负责生产和管理各组件的工厂,同时也是组件运行的容器。BeanFactory根据配置文件确定容器中Bean的实现,管理Bean之间的依赖关系。ApplicationContext是BeanFactory的加强,为J2EE应用提供了大量功能。

2.spring web和MVC

spring的web框架围绕DispactcherServlet设计,将请求分发到不同的处理器。

3spring aop

aop和ioc互补,核心构造是切面,将那些影响多个类的行为封装到可重用的模块中。

     

 二、IOC概述

DI(依赖注入)的概念用以代替IOC,即让调用类对某一接口实现类的依赖关系(依赖关系是指一个类负责实例化另外一个类)由第三方(容器或协助类)注入,以移除调用类对某一接口实现类的依赖。分为构造函数注入、属性注入和接口注入。

构造函数注入:

public class MoAttack{
    private GeLi geli;
    public MoAttack(GeLi g){
         this.geli=geli;
    }
   public void cityGateAsk(){}
}

public class Director{
    public void direct(){
        Geli geli=new LiuDehua();
        
        MoAttack mo=new MoAttack(geli);
        mo.cityGateAsk();
}

属性注入:

public class MoAttack{
    private GeLi geli;
    public void setGeli(GeLi g){
         this.geli=geli;
    }
   public void cityGateAsk(){}
}

public class Director{
    public void direct(){
        Geli geli=new LiuDehua();
        MoAttack mo=new MoAttack();
<span style="white-space:pre">	</span>mo.setGeli(geli);
        mo.cityGateAsk();
}
通过容器注入:

角色实现类的实例化工作的代码依然存在,只是转移到Director类中而已。可以通过第三方的容器来解耦。它帮助完成类的初始化,让开发者从这些底层实现类的实例化、依赖关系装配等工作中脱离出来,专注于更有意义的业务逻辑开发工作。spring就是这样一个容器,通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。

<beans>
    <bean id="geli" class="LiuDeHua"/> 
    <bean id="moAttack" class="MoAttack" 
      p:geli-ref="geli"/>
</beans>
通过new XmlBeanFactory("beans.xml")等方式即可启动容器,启动容器时,spring根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配,从容器中即可返回准备就绪的bean实例,后续可直接使用。spring之所以可以仅凭一个简单的配置文件就能实例化并装备好程序所用的Bean是因为Java语言本身的类反射功能。
Bean工厂是spring框架最核心的接口,提供了高级IoC的配置机制。ApplicationContext是建立在BeanFactory基础之上,提供了更多面向应用的功能,提供了国际化支持和框架事件体系,更易于创建实际应用。


三、在IoC容器中装备Bean

spring Ioc容器中的一个Bean即对应配置文件中的一个<bean>,id为这个bean的名称,通过容器的getBean方法可以获取,是外部程序和spring IoC容器进行交互的桥梁。class属性指定了Bean对应的实现类。

属性注入:

<bean id="car" class="Car">
<property name="maxSpeed"><value>200</value></property>
<property name="price"><value>20000</value></property>
构造函数注入:

<bean id="car" class="Car">
      <constructor-arg type="java.lang.String">
            <value>红旗</value>
      </constructor-arg>
      <constructor-arg type="double">
            <value>20000</value>
      </constructor-arg>
</bean>

bean通过<ref>元素引用其他的bean,建立起依赖。

<bean id="car" class="Car"/>
<bean id="boss" class="Boss"/>
	<property name="car">
		<ref bean="car"/>
 	</property>
</bean>
<ref>元素可通过以下三个属性引用容器中其他Bean。bean、local(只能引用同一配置文件中定义的bean)和parent(引用父容器中的bean)

简化配置方式:

使用p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。

声明p命名空间:

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

<bean id="car" class="Car"

p:brand=“红旗&amp;CA72"

p:maxSpeed="200"/>

<bean id="boss class="Boss"

p:car-ref="car"/>

字面值属性格式为: p:<属性名>="xxx"

引用对象的属性: p:<属性名>-ref="xxx"


基于注解的配置:

不管是XML还是注解,都是表达Bean定义的载体,实质都是为spring容器提供bean定义的信息。采用基于XML的配置,Bean定义信息和Bean实现类本身是分离的。采用基于注解的配置方式时,bean定义信息即通过在bean实现类上标注注解实现。

使用@Component注解在UserDao类声明处对类进行标注,可以被spring容器识别,spring容器自动将POJO转换为容器管理的Bean。和以下的XML配置是等效的<bean id="userDao" class="UserDao"/>除了@Component之外,spring提供了3个功能基本等效的注解:

@Repository:用于对DAO实现类标注

        @Service:用于对Service实现类标注

@Controller:用于对Controller实现类标注

spring还提供了一个context的命名空间,提供了通过扫描类包以应用注解定义Bean的方式。要声明一个context的命名空间,<context:component-scan base-package="XXX"/>,spring容器将会扫描这个基本类包里的所有类,从类的注解信息中获取bean的定义信息。

使用@Autowired自动注入:

@Autowired默认按照类型匹配的方式,在容器查找匹配的Bean,当且仅有一个匹配的Bean时,spring将其注入到@Autowired标注的变量中。Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。在域变量上加上标签@Autowired,并且去掉相应的get 和set方法,详情介绍可见:http://blog.csdn.net/heyutao007/article/details/5981555


四、spring AOP基础

①和②处的业务代码淹没在重复化非业务性的代码之中。假设将ForumService业务类看成一段圆木,将removeTopic和createForum方法分别看成圆木的一截,会发现性能监视和事务管理的代码就好像一个年轮,而业务代码是圆木的树心,正是横切代码概念的由来。

无法通过抽象父类的方式消除以上所示的重复性横切代码,因为这些横切逻辑依附在业务类方法的流程中,不能转移。AOP通过横向抽取机制为这类重复性代码提供解决方案。
AOP术语:
连接点:程序执行的某个特定位置,例如类开始初始化前、类初始化后、类某个方法调用前等
切点(pointcut): AOP通过切点定位特定连接点,定位到具体某个方法上。
增强(advice): 织入到目标类连接点上一段代码。
织入: 将增强添加到目标类具体连接点上的过程。
切面:由切点和增强组成,既包括了横切逻辑的定义,也包括了连接点的定义,spring aop就是负责实施切面的框架。

通过@AspectJ配置

在类定义处标注一个@AspectJ注解,第三方程序判断这个类是否一个切面。在beforeGreeting()方法定义出,标注了@Before注解表示是前置增强,成员值是一个@AspectJ切点表达式,意思是在目标聊类的greetTo()方法织入增强,greetTo方法可以带任意的入参和任意的返回值。③处就是横切逻辑,该横切逻辑在目标方法前调用。PreGreetingAspect一个类通过注解和代码,将切点、增强类型和增强的横切逻辑糅合到一个类中,使切面的定义浑然天成。最后通过AspectJProxyFactory织入基于@AspectJ切面。
通过配置完成切面织入的工作:

spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,具体细节被<aop:aspectj-autoproxy/>隐藏起来了。


五、srping mvc概述
1. 客户端发出一个HTTP请求,web应用服务器接收请求,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet。
2.DispactherSerlvet收到请求后,根据请求的信息以及HanlerMapping的配置找到处理请求的处理器(handler)。spring mvc中没有定义一个Handler接口,实际上任何一个Object都可以成为请求处理器。
3. 通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是一个适配器,用统一的接口对各种Handler方法进行调用。
4.处理器完成业务逻辑后处理返回一个ModelAndView给DispatcherServlet,ModelAndView包含了试图逻辑名和模型数据信息。
5.ModelAndView包含的是逻辑试图名,借由ViewResovler完成逻辑视图名到真实视图对象的解析工作。
6.得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。
7.最终客户端得到响应信息。

配置DispatcherServlet
在②处配置了名为baobaotao的DS,它默认自动加载/WEB-INF/baobaotao-servlet.xml(<servlet-name>-servlet.xml)的spring配置文件,启动web层的spring容器。③处指定DS处理所有URL以.html为后缀的HTTP请求。

注解驱动的控制器:
如何将请求映射到对应的控制器方法是spring mvc框架最重要的部分,由RequestMapping承担。通过请求URL进行映射,如@RequestMapping("/user"),相对于web应用的部署路径。
请求处理方法的签名的限制很宽松,请求参数可以如按名称匹配的方式绑定到属性中,可直接把HTTP请求对象传递给处理方法。
使用命令/表单对象绑定请求参数值,其URL要把请求参数正确地填写到对象中。如:
@RequestMapping(value="/XXX")
public String handle(User user){...}
url: /XXX?userName=tom&dept.deptId=1
也可以使用Servlet API,如HttpServletRequest。
@RequestMapping(value="/XXX")
public String handle(HttpServletRequest request){...}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值