美文网首页
Spring的学习

Spring的学习

作者: 大炮对着虫子 | 来源:发表于2018-03-14 20:47 被阅读17次

    接口和抽象类?

    抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性
    1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

    2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过

    在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

    Spring是一款无倾入式,轻量级的框架。
    Spring分层?
    J2EE体系结构中有客户端服务端,服务端又划分为典型的MVC模型分层(web层、业务层、持久层)。

    spring 为开发带来什么(spring的有哪些部分组成)
    spring IOC方便解耦,简化开发
    AOP面向切面的支持
    声明式事务的支持
    方便程序的测试
    方便集成各种 框架

    依赖注入是Spring IOC的一个最佳实现,其可以采用四种注入的方式

    构造器注入
    
    Set注入
    
    接口注入
    
    注解注入(自动注入)
    
    <bean id="simpleMovieLister" class="examples.SimpleMovieLister">
        <constructor-arg ref = “movieFinder”/>
    </bean>
    
    <bean id=”movieFinder” class=”examples.MovieFinder”/>
    
    

    使用index属性来显示指定构造器参数的顺序:

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg index="0" value="OMS_TEST"/>
        <constructor-arg index="1" value="Sino/2017"/>
    </bean>
    
    

    通过属性的Set方法进行注入的一种方式

    <bean id="simpleMovieLister " class="examples.SimpleMovieLister ">  
            <!--(1)Set注入-->  
            <property name="movieFinder" ref="movieFinder"></property>  
        </bean>  
    <bean id="movieFinder " class="examples.MovieFinder "></bean> 
    
    

    (1)no:这是默认的,不会自动注入。在大型部署中不建议修改默认配置,因为显示地指定依赖会更加清晰和便于控制。
    (2)byName:通过属性名称来自动注入。Spring会查找和属性名称相同的Bean来自动注入。
    (3)byType:如果恰好有一个Bean与指定的类型相同,那么自动注入这个Bean。如果这个类型的Bean超过一个,会抛出错误异常,也就意味着不能使用byType来自动注入。
    (4)constructor:跟byType类似,但是适用于构造器参数。如果容器中不存在指定构造器参数类型的Bean,或者多余一个的,那么会抛出错误异常。
    当在一个工程中均采用自动注入时,自动注入会表现得很好。若不是经常使用,而只用自动注入来注入一个或两个Bean,那么这样会使得开发者感觉疑惑。

    (1)在property和constructor-arg设置的显示依赖总是会覆盖自动注入。

    (2)自动注入没有显示指定那么准确。也许,你不太容易找到Bean所依赖的真正实现Bean。

    (3)不太容易通过工具来生成文档。

    (4)指定类型也许会匹配到多个Bean,容器将不会自动注入这个bean。

    AOP能干什么,能带来什么好处

    降低模块的耦合度,使系统容易扩展,更好的代码复用性,设计决定的迟绑定
    AOP术语:
    切面(Aspect)

    通知(Advice)

    目标(Target)

    代理(Proxy)

    连接点(Joinpoint)

    切点(pointcut)

    image.png

    Advice

    前置通知(Before Adivice)

    后置返回通知(After returning Advice)

    后置异常通知(After throwing advice)

    后置通知(After (final) advice)

    环绕通知(Around advice)

    AOP是什么?
    AOP(aspect oriented program)即面向切面编程。我们在学习java面向对象编程OOP时,
    面向对象有三种特性:封装,继承,多态。当我们在对分散的对象实现公共的行为时,
    OOP会使代码比较冗余,复杂。AOP是对OOP的补充和完善。它是一种横
    切的技术,主要应用有:打印日志,事务管理,权限控制,访问控制;实现
    了通用的功能,将主业务逻辑和非业务逻辑分离出来。
    AOP为开发者提供了一种描述横切关注度点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。

    AOP能干什么,能带来什么好处?

    降低模块的耦合度
    使系统容易扩展
    更好的代码复用性
    设计决定的迟绑定
    

    实例化Spring容器常用的两种方式:

    方法一: 在类路径下寻找配置文件来实例化容器
     ApplicationContext ctx = new ClassPathXmlApplicationContext
    (new String[]{"beans.xml"});
    
     方法二: 在文件系统路径下寻找配置文件来实例化容器
     ApplicationContext ctx = new FileSystemXmlApplicationContext
    (new String[]{“d:\\beans.xml“});
    
    // 创建和配置bean 
    ApplicationContext context = new ClassPathXmlApplicationContext
    (new String[] {"services.xml", "daos.xml"}); 
    // 查询配置的实例
     OrderService service = (OrderService)ctx.getBean("personService");
    

    Bean初始化
    使用init-method属性来指定无参方法的名字

    <bean id="exampleInitBean" class="examples.ExampleBean"
     init-method="init"/> 
    public class ExampleBean
     {
     public void init() 
    { //做一些初始化工作 } 
    }
    
    

    使用InitializingBean接口

    <bean id="exampleInitBean" class="examples.AnotherExampleBean"/> 
    public class AnotherExampleBean implements InitializingBean
     { public void afterPropertiesSet() { //做一些初始化工作 } }
    

    事务的特性:
    原子性(Atomicity) 事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用
    一致性(Consistency) 事务在完成时,必须是所有的数据都保持一致状态
    隔离性(Isolation) 并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性
    持久性(Durability) 一旦事务完成,数据库的改变必须是持久化的

    事务并发所可能存在的问题

    脏读 一个事务读到另一个事务未提交的更新数据
    不可重复读 一个事务两次读同一行数据,可是这两次读到的数据不一样 幻读 一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行
    第一类丢失更新 撤消一个事务时,把其它事务已提交的更新的数据覆盖了
    第二类丢失更新这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据为了解决数据库事务并发运行时的各种问题数据库系统提供四种事务隔离级别:

    image.png
    事务传播属性

    REQUIRED:业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。
    NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
    REQUIRESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
    MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。
    SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。
    Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。
    NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效

    相关文章

      网友评论

          本文标题:Spring的学习

          本文链接:https://www.haomeiwen.com/subject/vlqzfftx.html