文档章节

(笔记 - 纯手敲)Spring的IOC和AOP 含GIT地址

勇恒
 勇恒
发布于 2017/07/24 22:26
字数 2485
阅读 37
收藏 1
点赞 1
评论 0

GIT地址:https://github.com/BravenZhou/spring-ioc-easy      


Spring容器框架,可以管理web层,业务层,dao层,持久层。
可以配置各个组件并维护bean之间的关系。当需要使用某个bean的时候 ,使用getBean方法即可
ApplicationContext对象就对应那个ApplicationContext。xml文件
1.使用Spring不必new对象 。我们把创建对象的任务交给了spring框架。
2.在一个对象中,引用另外一个bean。(即spring管理对象关系)用ref。

spring框架怎么被加载?spring中配置的bean怎么被加载?bean关系如何维护?
ClassPathXMLApplicationContext被加载的时候,相当关键:它执行的时候,
  spring容器对象被创建,同时applicationContext中配置的bean就会被创建。
  内存中(结构是一个hashmap) :
     id有你配置的id=,然后有对象的实例。
     ApplicationContext.put("userService",userService);
     需要获取的时候就调用ac.getBean()方法即可
Dom4J是反射机制。

ioc:所谓控制反转,就是把创建对象和维护对象之间的关系的权利,
     从程序中转移到spring容器中(applicationContext.xml)。
di:spring设计者,认为di更能准确表示spring核心技术。

大的项目,行业不一样。但是有很多可复用模块,如日志,等,之间配置就可以了。
但这些属于高级模块,也还是需要有底层的基础。

可以写一个applicationContextUtil的方法,直接调用getBean方法。

MVC:
model层:包括业务层,dao层,持久层(一个项目中不一定都有这三个)。
view层:jsp
Controller:Action。

spring提倡接口编程,DI技术可以层与层之间的解耦。
    UserService userService = ac.getBean("userService");
    //同样一行代码,如果有两个类需要实现UserService对象时,只需更改配置
              <bean id="userService" class="com.UserService1Impl"/>
    切换为--> <bean id="userService" class="com.UserService2Impl"/>
spring用到代理技术。
springXML文件中的bean是不能写class=接口的,只能写具体的实现类。
  接口编程的优势就在这里:当有多个不一样的类实现同一个接口时,可用接口来实现。
  这样Controller层对于Service层就完全解耦了,只要spring.xml文件配置即可。

ApplicationContext应用上下文容器中获取bean和从bean工厂容器中,获取bean有什么不同?
  1.上下文获取时:当我们实例化xml时,该文件中配置的bean被实例化;
  (前提是bean的配置是singleton,如果scope=prototype或者别的,也是延迟加载)
  2.Bean工厂中获取的时候:
    BeanFactory factory  = new XmlBeanFactory(
      new ClassPathResource("applicationContext.xml"));
    此时没有实例化bean。
    当factory.getBean()时,bean才被加载(延迟加载)。
    一般是在移动设备中使用bean工厂方法,节省内存。
    而大部分应用中,都是直接加载的。
    
获取ApplicationContext对象引用的三种方法:
  1.ClassPathXMLApplicationContext 通过类路径
  2.FileSystemXmlApplicationContext 通过文件路径来获取。
    如("F:\JAVA INFORMATION\TARENA\xxxxx08\API")
    不过记得要加转义字符:("F:\\JAVA INFORMATION\\TARENA\\xxxxx08\\API")
  3.XmlWebApplicationContext 下次再说。
  
Bean的生命周期(applicationContext方式):
  任何技术的生命周期是重点:因为只有当生命周期弄明白了,才能驾驭这个技术。
  1.实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是singleton)
    实例化到spring容器中(默认无参构造函数被调用)。
  2.调用Set方法,设置属性(必须要有一个set方法)。
  3.若实现BeanNameAware接口,通过SetBeanName获取配置的id号:如userService。
  4.若实现BeanFactoryAware接口,SetBeanFactory传递beanFactory对象。
  5.若实现ApplicationContextAware接口,setApplicaitonContext获取上下文对象。
  6.自己实现BeanPostProcessor接口,有before方法和after方法。
    那么,每一个bean实例化之后,都会调用这个before和after
    可以实现“记录每个对象实例化的时机”&“过滤每个调用对象ip的地址”等需求。
    给所有对象添加一个属性,或者函数。(ApplicationContext.xml文件配置bean)
    (很有面向切面编程的味道)针对所有对象编程。
  7.若实现BeanInisizing接口,则在before方法后调用afterPropertySet方法。
  8.如果自己在<bean init-method="init"></bean>,则可以在bean定义自己的初始化方法。
  9.使用bean
  10.容器关闭
  11.如果DisableBean接口,则实现destory()方法释放资源。——>用的比较少。
  12.可在bean中配置destory_method方法。
小结:在实际开发中,1-2-6-9-10

BeanFactory获取bean对象,其bean的生命周期:
  比前面的少了几个,没有ApplicationContextAware,BeanPostProcessor

__________
Bean装载:
尽量不要设置scope=‘prototype’,对性能影响较大。

  1.当然也可以在property中配置内部bean(用到较少)。
  2.在bean的配置中,用一个parent,表示继承。
  3.Map,List,Set,集合的配置:
    如果Collection c= new ArrayList();
      那么c只能有collection的方法,没有ArrayList的方法。
      但c是一个ArrayList的实例。
    List是有序的,set是无序的。
    List中可以有相同的对象。set中不能有相同的对象,直接覆盖掉了。

    Map的循环可以用entry(简单):
    或者Map的循环也可以用迭代器。
    Map的key相同的时候,也是覆盖。
  4.Properties的使用和注入:
    <property>
        <prop key="pp1">abcd</prop>
        <prop key="pp2">44</prop>
    </property>
    property的循环也有两个:一个是entry,一个是enumeration
  5.设置空注值:<null/>包在property中。

自动装配bean的属性值:autowaire=五种(看文档)
  1.no:默认
  2.byName:autowire=byName表示根据名字来自动装载。
  3.byType:顾名思义
  4.constructor:
  5.

特殊bean分散配置:
  2.PropertyPlaceholderConfigurer:SpringProperties获取配置的值。
    也可以引入<context:property-placeholder location="dev/db.properties"/>
    ${url}叫做占位符**。

--------------AOP------------
Aspect Oriented Programming
面向切面(方面)编程:是对所有对象,或者一类对象进行编程。
 -核心特点:在不增加代码的基础上,还增加新功能。

汇编语言:面向机器。伪机器指令 mov jump .
   C语言:面向过程。最容易帮助人理解语言的本质。
          系统语言,大部分都是用C语言写的,如操作系统,数据库,杀毒软件,防火墙。
aOP面向切面编程:面向多个对象编程
                 如多个service都有事务,则抽取出来。另外还有日志,安全。
    aop在框架本身用的很多。
    
aop运行原理 + 案例:
  1.aop的功能例如日志,可通过公共方法,在每一个需要的地方调用即可。
  2.代理对象(spring提供proxyFactoryBean):通过代理接口来实现代理任务。
    五种通知:
      1.before(前置):实现MethodBeforeAdvice接口即可。
        也是通过反射完成:当调用该代理方法时,即可知道参数等。
        其中,applicationContext.xml需要配置
          1.被代理的对象(目标对象)
          2.前置通知(通知就是切面的实际实现)
          3.代理对象(本身是ProxyFactoryBean对象实例)
            3.1代理接口集
            3.2织入通知
            3.3配置被代理对象
          <beans>
            <!-- 1.配置被代理的对象 -->
            <bean id="test1Service" class="com.Test1service">
                <property name="name" value="wo"/>
            </bean>
            <!-- 2.配置前置通知,后置通知,环绕通知,异常通知,引入通知 -->
            <bean id="myMethodBeforeAdvice" class="com.MyMethodBeforeAdvice">
            <!-- 3.配置代理对象,它本身是ProxyFactoryBean对象实例 -->
            <bean>
                <!-- 3.1理接口集 -->
                <property name="proxyInterfaces">
                    <list>
                        <value>com.jos.TestServiceInterface</value>
                    </list>
                </property>
                <!-- 3.2织入通知 -->
                <property name="interceptorNames"> ----相当于调用setInterceptorNames()方法
                    <value>myMethodBeforeAdvice</value>
                </property>
                <!-- 3.3配置被代理对象 -->
                <property name="target" ref="test1Service"/>
            </bean>
          </beans>
      (一个类实现了多个接口,那么这个接口之间是可以互相转的。)
      2.3.4.5.后置通知,环绕通知,异常通知,引入通知。
      
      
SpringAOP中,通过代理对象去实现AOP技术的时候,获取的ProxyFactoryBean是什么类型?
   答:返回的是一个动态代理对象。
       1.如果实现了若干接口的话,Spring就使用(JDK)java.lang.reflct.Proxy代理
       2.如果没有实现接口的话,Spring就使用CGLIB库生成目标对象。
         对接口的代理,优于对类的代理,可以实现更加松耦合的系统。
         对类的代理,作为备选。
         不能对final方法进行通知。

SpringAOP还有另外了两种实现方式:
    1.一种方式是使用AspectJ提供的注解:
        package test.mine.spring.bean;

        import org.aspectj.lang.annotation.AfterReturning;
        import org.aspectj.lang.annotation.Aspect;
        import org.aspectj.lang.annotation.Before;
        import org.aspectj.lang.annotation.Pointcut;
        @Aspect
        public class SleepHelper {

            public SleepHelper(){
                
            }
            
            @Pointcut("execution(* *.sleep())")
            public void sleeppoint(){}
            
            @Before("sleeppoint()")
            public void beforeSleep(){
                System.out.println("睡觉前要脱衣服!");
            }
            
            @AfterReturning("sleeppoint()")
            public void afterSleep(){
                System.out.println("睡醒了要穿衣服!");
            }    
        }
    然后加上这个标签:
    <aop:aspectj-autoproxy/> 有了这个Spring就能够自动扫描被@Aspect标注的切面了

    2.第三种,常用的。
        <aop:config>顶级配置元素,类似于<beans>这种东西
        <aop:pointcut>定义一个切点
        <aop:advisor> 定义一个AOP通知者
  
MYSQL 和redis
1.一个是存在内存中,一个是磁盘。
2.SQL语句不同。
3.性能上,redis更适合存放热点数据,比如用户登录信息及下单时用到的渠道、品种、合约信息。如果未命中缓存则去访问mysql
4.redis有大量数据结构如string,list,set,hashSet等

Mybatis中:$
    的like '%${ }%' 是用来做模糊查询时候用。

Hibernate 与 Mybatis的区别
1.项目选择上,如果一个项目基本没有复杂查询,那么hibernate就很好用了。但如果复杂语句较多,Mybatis会更好。
2.工作量上,Mybatis需要手写SQL以及resultmap,而hibernate有良好的映射机制,无需关心sql映射,可以更专注于业务。
3.性能上,Hibernate会查询所有字段,稍微有点消耗,Mybatis可针对需要来指定。
4.日志,Hibernate有自己的日志,Mybatis需要使用log4j
5.缓存……

SpringMVC中的注解:
    1.@Controller


BeanFactory & FactoryBean 的区别:
BeanFactory是用来管理bean的工厂。
FactoryBean是实现了FactoryBean<T>的bean。根据该bean的id从beanFactory中获取的,
    实际上是factoryBean的getObject返回的对象。如果要获取factorybean对象,可以在id前
    加上&符号来获取。
 

© 著作权归作者所有

共有 人打赏支持
勇恒
粉丝 2
博文 92
码字总数 56670
作品 0
杭州
IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981 ⋅ 2016/07/25 ⋅ 14

阿里老司机带你使用Spring框架快速搭建Web工程项目

摘要:Spring 框架是一个开源的 Java 平台,它为容易而快速的开发出耐用的 Java 应用程序提供了全面的基础设施。借助于Spring框架可以快速搭建Web工程项目,本文中阿里巴巴高级开发工程师嵛山...

萌萌怪兽 ⋅ 05/15 ⋅ 0

推荐几个自己写的Java后端相关的范例项目(转载)

http://wosyingjun.iteye.com/blog/2312553 这里推荐几个自己写的范例项目,主要采用SSM(Spring+SpringMVC+Mybatis)框架,分布式架构采用的是(dubbo+zookeeper)。范例项目的好处是简单易...

指尖的舞者 ⋅ 2016/09/27 ⋅ 0

BeanPostProcessor —— 连接Spring IOC和AOP的桥梁

之前都是从大Boss的视角,来介绍Spring,比如IOC、AOP。 今天换个视角,从一个小喽啰出发,来加深对Spring的理解。 这个小喽啰就是,BeanPostProcessor(下面简称BBP)。 讲解思路: BBP怎么...

SexyCode ⋅ 06/19 ⋅ 0

微热山丘,探索 IoC、AOP 实现原理(一)

微热山丘,探索 IoC、AOP 实现原理(一) 码蜂笔记2017-12-241 阅读 IoCAOP 一. 简介及项目设定 1.1 微热山丘 介绍 warmhill(微热山丘) 是一个参考 Spring 实现 IoC、AOP 特性的小项目。 ...

码蜂笔记 ⋅ 2017/12/24 ⋅ 0

运动记录系统之概述

一、为什么做? 1、自己喜欢运动,自己也是个程序员,所以想通过自己的系统记录下运动过程的点滴,并且有可能的话,也能帮助“宅男宅女”们热爱运动,拥抱健康。 2、在做这个系统的过程中,系...

丈量大地 ⋅ 2015/11/02 ⋅ 4

Spring AOP就是这么简单啦

前言 只有光头才能变强 上一篇已经讲解了Spring IOC知识点一网打尽!,这篇主要是讲解Spring的AOP模块~ 之前我已经写过一篇关于AOP的文章了,那篇把比较重要的知识点都讲解过了一篇啦:Sprin...

Java3y ⋅ 05/24 ⋅ 0

轻量级的Java应用编程框架--ZolltyMVC

ZolltyMVC框架是一款轻量级的Java应用编程框架,融合了常用的IOC/DI、MVC(注解、XML配置、RESTful API、模型驱动、视图模板等)功能。目的就是帮助大家开发高效、灵活、高质量的应用,并减轻...

Zollty ⋅ 2015/09/16 ⋅ 0

Spring(二):配置和简单使用

1、下载地址(目前使用的是4.2.0) 下面都可以 http://repo.springsource.org/libs-release-local/org/springframework/spring http://repo.spring.io/simple/libs-release-local/org/sprin......

_Roger_ ⋅ 2015/08/16 ⋅ 0

Spring IOC 容器源码分析系列文章导读

1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于...

coolblog ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 21分钟前 ⋅ 2

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部