SSM框架-----Spring篇

时间:2024-01-29 17:51:43

SSM框架是spring MVC,spring和mabatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层。

spring MVC:负责请求的转发和视图管理。

spring        :实现业务对象管理。

mybatis      :作为数据对象的持久化引擎。

 

一.谈谈你对Spring框架的理解

1.Spring是什么?

    Spring一个开源的,用来简化企业级应用开发的应用开发框架。Spring的核心就是IOC(控制反转)和AOP(面向切面编程)。

  Spring容器:spring框架中的一个核心模块,用来管理对象(包括对象的创建,销毁和初始化等)。它帮助完成类的初始化与装配工作,让开发者从这些底层类的实例化,依赖关系装配类的工作中脱离出来,专注于更有意义的业务逻辑开发工作。

    启动spring容器:

        step1.导3.2.8的包

        step2.配置xml文件+junit包(这个包是为了测试用的)

        step3.读xml文件创建容器

               

   

 

     

Spring如何创建对象?——spring容器依据配置文件创建对象。

方式一: 无参构造器(或者缺省构造器) 

step1:为类添加无参构造器(内部有了这个无参构造的类就可以省略这一步) 

step2:配置文件中添加一个bean元素

step3:启动创建容器,调用容器的getBean方法就是实例化这个类返回对象<---重要思想!!!!!!!!!!!!!

Step1:                                                                                                                                              

         

 step2:

               

step3:

      

 

 

方式二: 用静态工厂方法创建(了解即可)---解决抽象类

 

Calendar c = ac.getBean("cal",Calendar.class);

方式三: 用实例工厂方法创建(了解即可)---解决抽象类



Date time = ac.getBean("time",Date.class);

 

2.Spring的作用:

  a.简化开发:spring对常用的API都做了一些简化和封装(比如,用spring jdbc访问数据库,就不用考虑如何获取连接和关闭连接)。

  b.解耦:spring帮我们管理对象的依赖关系,这样对象间的耦合度低,方便维护。

  c.集成其他框架:spring可以将其他的框架集成进来。(比如可以将Mybatis等框架集成进来)

 

 

1.1 ioc是什么?

     IOC——:inversion of control,即“控制反转”,ioc不是一种技术,是一种设计思想,一个重要的面向对象编程的法则。在java开发中,IOC意味着将你设计好的对象交给容器控制,而不是在传统的在你的对象内部直接控制。

  何为“控制”:传统的JAVA SE程序设计,我们是从对象内部通过new创建对象,是程序控制对象的创建,而IOC有一个专门的容器(IOC容器)创建对象,IOC容器控制外部资源的获取(包括对象,文件等)。

  何为“反转”:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,即“正转”。而“反转”,是由容器来帮我们去创建及注入依赖对象。对象只是被动的接受依赖对象。依赖对象的获取被反转了。

1.2 ioc有什么用?

   ioc容器能帮我们管理对象的依赖关系,这样对象与对象的耦合度低,方便代码的维护。对于spring框架来说,ioc就是由spring来负责控制对象的生命周期和对象间的关系。

1.3 DI

  DI——dependenc injection,即“依赖注入”。IOC与DI有什么关系呢?其实它们是同一个概念的不同角度描述。“依赖注入”,相对ioc而言,“依赖注入”明确地描述了“被注入对象”依赖ioc容器配置依赖对象。IOC的一个重点是在系统运行中,动态的向某个对象提供所需要的其他对象,这一点通过DI实现。DI如何实现?这就要引入java 1.3之后的一个重要特征——反射(reflection)。它允许程序在运行的时候动态生成对象、执行对象的方法、改变对象的属性。spring就是通过反射注入的。

1.4 spring的两种注入方式

 1.4.1. 构造器注入:通过调用的类的构造函数,将接口实现类通过构造函数变量传入。

构造器注入步骤:

step1.添加相应构造器:                                                                                                                               

                 

        

step2:配置文件xml

xml的启动相当于容器的启动,constructor-arg意思是构造器,相当于写了Manager类的构造方法ref=cp相当于Computer类型的对象cp,因为构造方法里面有this.cp=cp;所以就相当与给Manager类里面的cp赋值了(类型必须是匹配的,都是Computer类型)相当于就在xml表里面写了Manager(Computer cp){},xml一启动就调用了

 

 

 

1.4.2:setter方法注入:是容器通过调用无参构造器或无参static 工厂方法实列化bean之后,调用该bean的setter方法, 即实现了基于setter的依赖注入

  set方法注入步骤:

  step1.为A类添加 IB类型常量并写上setB():                                                                                              

                                                       
                      

                                 

                                                                                                                                                                                   

                                                                                      

 

 step2.配置文件xml:

这个name=b相当于写了A类里面的setB方法,ref=c相当于C类型的对象c,因为set方法里面是this.b=b,所以一旦调用set方法就相当于给A类里面的b赋值了


 

 

一.使用注解简化配置文件------------------------------------------------

组件扫描: Spring容器启动之后会检查某个包以及子包下面的所有的类,如果类前面有特定注解(比如@Component),
则容器会将该类纳入容器进行管理(就相当于配置了一个bean元素)          

其中init跟destroy的注释@PostConstruct跟@PreDestroy是sun公司的,要导annotation包
生命周期相关注解:@PostConstruct/@PreDestroy
延迟加载和作用域相关注解:@Lazy(true)/@Scope("prototype")/@Scope("singleton")
依赖注入相关注解(就是set注入和构造器注入):@Autowired和@Qualifier("wt") ,@Qualifier如果不加的话,会按照byType的方式来自动装配,就有可能找到多个,建议最好使用该注解,明确指定被注入的bean的id。
@Resource(name="wt"): 1.只支持set方法的注入. 2.使用name属性指定被注入的bean的id

                  

STEP1.在类前面加注释,方法前面加注释

STEP2.配置里面扫描包

 

测试结果1 :         

     

测试结果2:                       

 

测试结果3:

 

Restaurant是set注入, Leader是有参构造方法注入, Manager是@Resource(name="")注入<

                                

 

 

                                                                                                                                                                       

                                                                                                                                                                                                                                                        

 测试

测试结果5:

 测试结果6:

测试结果7:

 

                                                                                                                                                                      

                                                                                                                                                                   

 

 

 

 

 

 

2.1 AOP

2.1.1   Aop是什么?

 AOP——(Aspect-Oriented Programming),即面向切面编程。AOP可以说是OOP的补充和完善,是Spring框架核心功能之一。

2.1.2   AOP的特点(优势)?

为了解决当我们需要为分散的对象引入公共行为的时候,如程序中交叉业务逻辑(系统日志,事务处理,系统安全验证,系统数据缓存等等),这是我们应当把它封装成一个切面,注入到目标对象(具体逻辑)中去。可以简化代码开发和效率,能够在不改变原有代码的基础上扩展新的功能实现。

2.1.3AOP 核心概念、术语

AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。其相关概念术语如下: 

切面(aspect): 横切面对象,一般为一个具体类对象(本质就是加了@Aspect注解的类)
通知(advice):拦截到连接点之后只要执行的方法
切入点(pointcut):对连接点拦截内容的一种定义
连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法
目标对象(target):代理的目标对象。
通知(Advice):在切面的某个特定连接点上执行的动作,例如before,after等 

知识点术语强化:
1) 切面(可以简单理解为要植入的新的业务功能,这个功能交给某个类负责,这个类就是切面)
2) 通知(可以简单理解为一个业务中的扩展逻辑的若干步骤,例如先做什么(before),再做什么(afterReturn),最后做什么)
3) 切入点(在原有的哪些业务方法上扩展新的业务,可以将切入点理解为方法的集合)
4) 连接点(可以简单理解为切入点中的一个具体方法)
5) 目标对象(需要扩展功能的那个对象,一般为被代理对象)
6) 代理对象(负责调用切面中的方法为目标对象植入新的功能)


2.1.4 Spring AOP 的编程实现

Spring中AOP代理由Spring的IOC容器负责生成、管理。
其依赖关系也由IOC容器负责管理。
因此,AOP代理可以直接使用容器中的其它bean实例作为目标,
这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理。

AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1. 定义普通业务组件(切面)
2. 定义切入点,一个切入点可能横切多个业务组件
3. 定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作。
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理

2.1.5 AOP怎么用?

面向切面@Aspect
step1. 导入3个Maven jar包,spring-context(里面包含了spring-aop),aspectjrt,aspectjweaver


step2. 配置spring-aop.xml

step3.写一个代理类,这个类相当于切面,注解@Aspect@Component,英文意思就是切面,扫描,

@Order(1)多个切面类时执行顺序注解,数字越小越先执行,在方法前面加你要的功能注解并指向被代理类,称为切入点如:@Before("bean(projectServiceImpl)"),实现类开头字母小写

  @AfterThrowing @AfterReturning @After 分别为目标方法异常后,目标方法正常结束后,目标方法之后, 
  空间想象就是当被代理类进来的时候会先经过代理类这个\'横切面\'过滤,在被代理类方法运行前后记录日志

   



step4. 被代理类实质上就是业务层,必须有注解@Service

step5. 测试的时候getBean("业务层类名开头字母小写",指向业务层实现的那个接口的名字);

     

 

 

step6. 对面向切面的接入点封装,之后就直接调用,如:@Before("method()")

    @Pointcut("bean(projectServiceImpl)")
    public void method(){}