spring入门

1. spring中重要概念:

1.  beans和core 他们提供了spring框架最基本功能: IOC和DI

    context上下文,基于beans与cores ,  spel 他是spring提供的一个表达式语言.

           2. loc  控制反转 : 原来由我们自己实例化的对象交给我们spring容器来实例化,这时候对象的初始化的权利就会反转.

                    ①.在xml中配置: <bean id="" class="全类名">  , 在springboot中配置 @Bean

                    ②.spring 中提供了beanfactory工厂,我们一般使用的是他的子接口类applicationContext,读取配置文件,实例化对象

                          applicationContext a =  new clasPathxmlapplicationContext("application.xml");

                               a.getbean("id");

           3. DI : 在spring框架负责创建bean对象,动态的将依赖对象(也就是参数)注入bean组件(方法)中.比如用: @Autowired

2.AOP:

      1.JDK动态代理: invoke方法的参数(proxy代理对象,调用方法的Method对象,调用方法的参数 )

                               Cglib可以没有接口,也可以有接口的类动态代理

      2.  spring 采用的是哪一种动态机制:
          如果目标对象,有接口,优先使用 jdk 动态代理
          如果目标对象,无接口,使用 cglib 动态代理

     3.静态AOP: 是指AspectJ实现的AOP,他是将切面代码直接编译到java类文件中

              动态AOP: 是指将切面代码动态织入实现的AOP 技术为

              JDK提供的动态代理和CGLIB(动态字节码增强技术)

      4.动态代理相关术语:

            目标对象 target:  只需要被增强的代理对象

            连接点: 指的是对象中哪些被拦截的方法

            切点: 指的是所有的连接点中哪些具有某些特征的方法进行切入

            通知: 分为前置,后置,异常通知等, 是指对这些方法进行增强操作

            切面: 切点和通知组成了切面

            织入: 指的是对代理对象进行增强的过程, 织入可以在编译期,

            类装载期,运行期等;AspectJ是静态织入,spring是动态织入

           代理对象: 指的是被织入后的对象,产生的结果代理对象;

3.bean获取与实例化

    它采用延迟加载的方案,只有真正的getbean时才会实例化bean.

   applicationContent 他是扩展了beanfactory接口,

   applicationContent实现类 FileSystemxmlapplicationcotext("src/..xml");classPathxmlapplicationcontext;

   applicationContext他会在配置文件加载的时候,就会初始化bean,,提交预处理错误的存在.

   并且applicationContext,在不同的应用层的context实现.

4. bean的作用域:

       在bean标签内 scope=" "
        prototype : 多例  每一次从spring容器中获取时,都会返回一个新的实例.

        singleton : 单例  代表springIOC容器中只有一个bean实例.(默认)

        request : 用在web开发中, 将bean对象使用request.setrrtribute()存储在request域中.

        session : 用在web开发中, 将bean对象使用session.setrrtribute()存储在session域中.


5. bean的生命周期:

      1. 实例化对象    2. 封装属性  

      3.如果实现了beanNameAware 重写方法, 得到bean的id或name值

      4.如果实现了applicationAware 重写方法, 得到application的对象

          第三步和第四步是让bean了解spring容器.  第五步和第八步是 对指定bean进行功能增强.

     5.对于bean的生命周期,两个方法: 增强bean可以使用后处理bean

     6. 如果需要初始化或销毁操作我们可以使用 init-method destroy-method

6. spring 通知基于AOP:

    1. 五种通知: 前置 ,后置 ,环绕 ,异常抛出通知, 最终通知

         环绕通知: 日志操作,权限校验, 性能监控,事物管理  最终通知: 资源释放.

    2. 声明切点的步骤:

         类上面:  @Aspect 声明当前bean是一个切面  方法上面:

        前置@before("execution(表达式)")

        后置 @AfterReturning(value = "execution(* *.update(..))", returning = "value")

        环绕通知:  @around("execution(* *.update(..))")

        异常通知:  @afterthrowing(value = "execution(* *.update(..))", throwing = "ex")

       最终通知: @After(value = "execution(* *.update(..))", returning = "value")

  3. execution()  用于描述方法
      语法:execution(修饰符  返回值  包.类.方法名(参数) throws异常)
        修饰符,一般省略
            public        公共方法
            *            任意
        返回值,不能省略
            void            返回没有值
            String        返回值字符串
            *             任意
        包,[省略]
            com.xc.crm            固定包
            com.xc.crm.*.service    crm包下面子包任意 (例如:com.itheima.crm.staff.service
            com.xc.crm..            crm包下面的所有子包(含自己)
            com.xc.crm.*.service..    crm包下面任意子包,固定目录service,service目录任意包
        类,[省略]
            UserServiceImpl            指定类
            *Impl                    以Impl结尾
            User*                    以User开头
            *                        任意
        方法名,不能省略
            addUser                    固定方法
            add*                        以add开头
            *Do                        以Do结尾
            *                        任意
        (参数)
            ()                        无参
            (int)                        一个整型
            (int ,int)                    两个
            (..)                        参数任意
        throws ,可省略,一般不写。

综合1
    execution(* com.itheima.crm.*.service..*.*(..))
综合2
    <aop:pointcut expression="execution(* com.xc.*WithCommit.*(..)) ||
                          execution(* com.itheima.*Service.*(..))" id="myPointCut"/>

 

 7.spring 事物:

       1.spring 事物管理的优点:

           ①.提供一致的对于不同的事物管理的API

           ②.支持声明式事务管理 ,基于aop对目标进行代理,添加around环绕通知.

          ③优秀的整合与spring的数据访问

          ④事物管理的三个接口: platformtransactionst(事物管理器) transactionstatus(事物运行状态)

                transactiondefinition 事物的一些相关信息 例如隔离 传播 超时,只读

       2.动态代理概念:

              ①. 代理对象存在的价值主要用于拦截对真是业务对象的访问,

              ②.  代理对象应该具有和目标对象相同的方法

              ③.. jdk里面的proxy,用newProxyInstance的invoke方法来实现代理,代理对象必须有接口

              ④. CGLB动态代理,无限制

       3. Spring事务其实就是spring AOP,底层创建了代理对象,然后在代码开头和结尾封装了开启事物和事物回滚或提交操作

       4.事物特性: 一致性,原子性,隔离性,持久性  

       5.事物属性:

                ① 事物隔离,事物隔离级别,由底层的数据库实现

                       一: 脏读: 读到了另一个事物未提交的数据

                       二: 不可重复读: 指的是事物中重复读取了别的线程已经提交的数据,两次查询不一致,导致银行报表有问题

                       三: 幻读: 所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,

                                当之前的事务再次读取该范围的记录时,会产生幻行;

                       四: 串行化: 强制事物串行执行,都加锁

              ②事物超时: 数据库超时

              ③事物只读: 一般用与查询 true/false

              ④事物回滚规则: rollback-for 设置一个异常,产生异常,触发事物回滚 no- rollback-for不会发生事物回滚

              ⑤事物传播行为:

                  一. REQUIRED : 表示业务方法需要在一个事物当中进行,如果这个时候业务方法执行的时候已经在

                                           一个已有的事物中了,则加入事物,否则重新开启 一个事物

                  二. NOT_SUPPORTED: 表示业务方法不需要事物,如果业务方法执行时候已经在一个事物中,则事物被挂起,

                                                       等方法执行完毕后,事物恢复执行

                 三  PROPAGATION_MANDATORY: 表明方法必须在事物中运行,事物如果不存在,则抛出一个异常

       3. spring jdbc Template 提供jdbc模板, 类似于dbutils

       4. Platformtransactionmanager: 平台事物管理器 作用: 解决在不同的持久化层技术事物代码不同问题.
              datasourcesactionmanager  用于mybatis
              hibernatesactoinmanager 用于hibernate

      5.注解:    可以使用 @Transaction(属性....) 在类或方法上添加事物管理.

                 isolation="隔离级别" propagation="事物传播"   timeout="超时时间默认值" read-only是否只读
                 rollback-for 设置一个异常,产生异常,触发事物回滚 no- rollback-for不会发生事物回滚

    

8. 注解开发:  


    1. 在xml中 一个约束文件,context名称空间, <context:component base-package="com.xc"/>

          指明spring扫描哪个包,它包含了 <context:annotation-config/>功能是作用是让spring常用的标签生效
 
    2. @Component("id名")在类上面, 如果没指定id名, 会默认以类名首字母小写.

    3.在spring2.5后为@Component添加了三个衍生的注解 ,针对不同的层用,  如果不确定哪个层,就用@component

         @Repository 用于DAO层    @Service 用于service层     @Controller  用于表现层

   4.属性依赖注入:

       ①简单属性或set方法注入:  @value("值")

       ②复杂属性或set方法注入:  对引用类型的成员属性,@autowired  默认是按照类型进行注入.

                        加上@qualifier("id名"),可以根据名称注入, 另一种注解 @resuore(name="id")

      ③ @autowired 和 @resuore 两种注解的区别:

            1. 都可以写在字段上,或卸载set方法上

            2. @autowired 默认是按照类型进行注入.

            3. @resuore是javaee的提供注解, 减少了与spring耦合,默认按照name记性装配, 查找不到,再按照类型注入.

    5.其他注解  @scope(值) 描述bean的作用域   在自定义初始化方法上加@postconstruct

           在销毁方法上加 @predestroy 只对于scope(singleton) 有效, 调用close方法时候才能够执行.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值