00:00
来吧,都看到这了啊,我们来把昨天讲的内容呢给大家再来回顾一下,呃首先啊,昨天主要讲了这么几个话题啊,我们先来看一下,呃,第一个话题呢,就是我们病的祝荣玉啊,然后第二个话题呢,它的这个生命周期,第三个话题呢,就是我们哎是从子讲的吗?是吧?好来第三个话题的生命周期啊呃,下一个话题呢,就是我们的呃外部的属性文件啊,引用一个属性文件,然后呢,去配一个我们的连接池啊呃,接下来就是一个自动装配啊,然后呢,讲了一个比较重要的就是通过注解来去配置我们的病,以及进行这个并并的这个装备啊呃下午的话呢,我们主要讲了一个动态代理这样的一个技术啊,这是我们昨天呃给大家讲的这个内容啊,然后呢,我们接下来来个头来看一下,先来看一下这个病的作用域,呃,病的作用域的话呢,我们给大家总共讲了四个啊,那其中有两个呢是比较重要的。
01:00
然后这两个呢,是大家必须要把它掌握的啊,那么第一个呢,就是我们的single高灯啊,就是我们的单利的,第二个就是我们的pro tap圆形的啊,也就是啊多粒的,然后呢,呃,你得知道单粒的啊,单类的这种病它的一些特点,以及这个proty多粒的啊,这种病的一些特点啊,这是我们给大家课堂上说过的,如果你是单立的病,那么在我这个容器创战的时候,我就会把这个对象创建出来了,然后等你每次盖着病方法来获取的时候,我给你返回的都是啊同一个对象吧,对不对?OK,如果你是一个多利的话呢,我容器启动的时候会创建对象吗?不会,而是等到什么呀,等到我盖了病的时候,我每次都给你返回一个新的对象,是这样的吧,OK,这个大家要记住了啊呃,然后下面的话,像这个request以及一个session,那么这个是我们外部环境下面的作用域,暂时呢我们还用不到啊,但是呢,我们是可以理解的啊,因为像这个request session呢。
02:01
我们在讲Java web的时候研究的也不少,好所以说呢,我们就结合上这个request跟session的一个特点来去理解它,如果你的作用力是一个request,那么它就是在每一次请求呢,都会帮你创建一个新的并应的这个实例,如果你是一个session呢,诶,我就在一个什么同一次绘画里面,就是同一个哎,三生对象啊,就是同一个绘画里面,我给你创建一个病的实例啊,这是它的一个作用域,这个其实特别好记吧,对吧?OK,那么我们知道了有四个作用域以后呢,啊,你也得知道啊,像这个S特呢,它是一个默认的,如果你想去设置它的作用域的话,那么你要通过一个scope这样的一个属性,然后呢,去指定一下当前我这个病,它的这个作用率能听懂了吧?OK,但是一般情况下啊,我们就把它设置为单立的,就是默认的就可以了,那我们很少很很少说会把它什么搞成这个啊,圆形的啊,或者这个多粒的啊,这个大家知道一下就行,来再来往下看,下一个呢,我们。
03:01
我讲的是病的生命周期啊,呃,对于这个生命周期来讲,首先呢,我们要知道默认情况下啊,它这个生命周期呢,分为几个阶段,就是我们讲过的总共有五个阶段吧,然后呢,在这五个阶段里面呢,比较重要的两个阶段呢,就是初始化跟这个销毁了,因为这是我们需要自己去写方法,然后呢,自己通过英译的method以及那个destroyed method来去指定的,这个都还记得吧,OK,然后呢,呃,我们在这个基础之上啊,还可以去写一个bin的后置处理器啊,就是我们讲过的bin post processor啊,这样一个类啊,这样一个接口,呃,我们需要自己去实现这个接口,然后呢,去写出一个自己的后置处理器来,然后呢,呃,我们需要去实现两个抽象方法啊,一个是before int,一个是after,那么正好对应的呢,就是在我们生命周期的初始化这个阶段的前后,分别再去执行一个对应的方法啊。
04:01
那么其实这样的话呢,就是把我们这个生命周期呢,更加的什么细分了啊,更加的什么细分了一下,那么我们就可以在每一个阶段里面呢,去做出一些什么特定的一些任务啊,那么当然昨天讲课的时候也给大家说了,那具体能做什么事呢?啊,这个也没有一个标准答案啊,就是等你只等你有了业务以后,你才能知道我这里面要去写什么东西啊,这个大家要知道啊啊呃,再一个的话,说一下这个后置处理器啊呃,这个后置处理器我们在写的时候呢,主要是研究了一下那个卡对象啊,它的这个生命周期,但是呢,你只要写出一个后置处理器来,那么它对我当前IOC容器中所有的病都会起作用,理解吧,哎,所有的病都会起作用啊,但是因为有些病呢,我们并没有给他去写那个初始化或者是销毁的方法,那么我们也就看不到他这个后置处理器的这个作用了,能听懂吧,如果说你把他们这个初始化跟销毁都写上了,那么其实他们都会有这个后置处理。
05:01
是这个作用的好,所以这个我们要记住啊,OK,下个话题呢,说了一下,引入外部的一个属性文件啊,那么我们是结合上啊,配置我们的连接池啊,来去给大家讲的还记得吧,OK,如果说你想配一个连接池啊,那我们就要去分析明白,连接池本身也是一个对象,那么既然你是一个对象,我就可以把它交给LC容器去管理啊,那么这个思想呢,也是大家现在要慢慢的去啊啊把它这个呃用起来的啊,就是呃,以前的话我们想要一个对象啊,那么大家可能直接想到了,就是我把它用一个对吧?啊或者说呢,更进一步的话,就是我通过工厂来获取一个,但是现在的话呢,我们讲了破以后,基本上你要用的对象呢,都要从这个LC容器里面把它获取出来,对吧,所以说我们要直接想到的就是诶,我需要什么什么对象了,好,那我把它交给LC容器去管理,然后呢,我等我用的时候呢,我再从这个LC容器中把它获取出来。
06:01
啊,所以说有了框架以后呢,我们就要诶有这样的一个想法,不要说这个老想着自己去拗它,明白了吧?啊,通过框架来去管理啊,啊那么既然你这个C3P0啊,就这个连接池对象,它本身呢也是一个对象,那么我们就可以把它交给我的LC容器进行管理啊,那么管理的时候呢,我们就要在对照呢,我们之前去写的时候,大家要注意,我们得给他设置一些什么基本的一些信息,是吧,连接的一些什么基本信息,那么这些信息的话呢,我们就可以啊诶通过它里面的赛的方法,分别给他们的这几个属性啊,进行一些什么值得注入啊,最后呢,你把这个基本的信息输入进去以后呢,它就能帮我们把这个连接值对象呢,给它创建出来,那么创建出来了以后呢,我们就可以啊,从它里面呢,获取我们的具体的连接了。啊,呃,那么我们讲完这个以后呢,说了一下,呃,这些配置如果说越来越多的情况下啊,那么我们维护起来呢,也就没有那么容易了,对吧?所以说我们希望把一些配置呢,给它提取出来,放到我们的一些什么属性文件中啊,那么因此我们就写了这样的一个属性文件啊写完以后的话呢,我们就要去考虑,那我怎么把这个属性文件引入到我当前的这个配置文件里面,我们就用到了一个contact啊这样的一个命名空间,呃,讲了两种方式对吧?第一种方式的话呢,就是使用一个B叫做什么来着,Property place how con figure啊是不是啊,那个类还比较长啊,好,通过它呢,我们也是可以把它读进来的,但是呢,又给大家说了一下,我们有一种更加简便的方式啊,那就是直接通过一个contact的命名空间,这里面呢,有一个property place操的,然后呢,你直接通过这个location去给它指向一个,诶,你的那个属性文件,它就能把它读进来了,那么读进来。
07:49
然后呢,我们在我们的C3P0配置里面的话,我们就会使用一个Dollar大括号这样的一个语法去指向我们配置文件里面的key,然后呢,就能把它所对应的那个V给它读出来了,能明白了吧?OK,说错了,这个的话呢,我们呃,相当于教会大家如何在这个spring里面去配置一个连接池,另外的话呢,也教会了你如何去读取一个外部的属性文件。
08:15
这个应该都没问题了吧?啊,比较简单啊,来吧,下一个话题呢,就是我们的自动装配了啊呃,那么对于自动装配来讲的话,比较简简单了啊,你就记住呃,我们可以在B的节点里面呢,通过一个auTo B啊来去指定一个自动装配的一个模式啊,我们讲了两种,第一种是by type,第二种是by name,还记得吧?OK,那么by name怎么装配,By tap怎么装配,这个大家一定要记清楚了是吧?By name的话就是根据你的名字,By tap呢,我要根据你的类型是不是啊,但是我们说完以后呢,说基于X ma的这种自动装备的,我们是不推荐大家去使用的,因为它有一些不足的地方,对吧,有一些小小的缺陷啊啊,那么等我们讲了那个注解以后呢,大家也能感受出来,在注解里面的话,我们一定是要会用到这个自动装配的,能明白吧,因为它的功能就比较强大。
09:11
还记得吧,这个OK,来吧,那么接下来我们就来说一下,通过注解来去配置我们的病,以及我们装配我们的病好,那么在这个话题里面呢,大家主要记这么几个点啊,第一个点就是我们常用的一些注解,你必须得记住了,明白吧,而且我们昨天在讲的时候呢,主要是用了诶这三个具体的一个注解,像我们这个component呢,我们暂时没有用上啊,大家下去以后你可以自己试一试啊,就是这几个注解对于现在来讲,你随便用用哪个都行,对吧?然后这个地方其实也说了一下啊呃,Spring呢,并没有能力去识别一个组件,它到底是是不是它所标记的这个类型,也就是什么意思呢?就算说你把一个P这个注解用到了一个表述层,控制成组件上面就是本来我应该标CTR了,但是我标了一个PY,它也不会出现任何错误,而且我们也能正常运行,听懂了吧,所以说呢,诶这几个具体的注解主要的作用是什么呢?主要就是让我们自。
10:12
己啊,明确当前的这个组件,他的角色是什么,你到底是充当的是持久层的角色,还是业务层的角色,还是说什么控制层的这个角色,理解这个意思吧,所以说呢,这四个重点,其实你标哪个都无所谓,当然有一个前提是在per里面,就是现在我们是可以的,等我们讲了MVC的时候,到时候呢,我也会给你重点去强调这个注解,我们就不能随便去标了,理解吧,因为它里面要重点的去使用一个CTRL重点来去标注它的那个控制器的啊,到时候我们讲的时候会来给大家去解释啊,现在的话呢,无所谓,你用哪个都行。听懂了吧,但是呢,我希望大家就养成一个习惯啊,什么组什么组件,我就标什么组件,对吧?你是持久层的组件,我就标PY,你是业务层的组件,我就标一个service啊,你是控制层的,我就标一个control了,如果说我不确定你到底充当了什么角色,那我就直接给你标上一个component。
11:13
记住了吧,OK,这个大家一定要养成一个习惯啊,呃,然后光知道了这个注解还不行啊,就是你标了注解以后呢,你还得让我们的support进行一个组建的一个扫描,对吧?诶,他得知道你哪些类标了注解了,我才能给你进行管理,因此呢,我们就有了一个组件扫描啊,或者叫什么扫描组件这样的一个话题,我们需要通过一个contact component,然后呢去指定一个机包啊,然后呢,他就会给你去扫描你指定的这个包,以及这个包子包里面的所有的类,然后呢,把标了注解的。这些类就给你管理到LC容器中了,对吧?昨天讲的时候呢,我也给大家具体解释了一下,比如说我标了一个CTRL的注解,那么它的作用是什么呢?哎,它就相当于在loc容器中通过B这样的一个标签去配置一下,还记得吧,这个记不记得记得了吧?哎,所以说你得理解哈,你标了一个注解,它的作用是什么?那其实说白了,你标注解的话呢,无非就是来简化我们的开发的,就让我们这个开发呢更加的迅速一点,对吧?不需要有那么多繁琐的配置,直接一个注解我们就可以把它搞定明白了吧?好呃,那么对于这个组件扫描来讲的话呢,我们还讲讲了一下指定扫描以及这个排除扫描,对不对?我们通过一个include filter以及一个exclude filter来去指定扫描和这个排除扫描啊,那么指定扫描的话呢,我们需要配合一个use default filter等于什么呀。
12:52
A等于false啊,来去什么指定扫描啊,那么呃,我们在不管是指定也好,或者排除也好,我们可以通过两种方式啊,第一种方式呢,就是通过注解的方式,第二种方式呢,通过一个什么?哎,具体类名的方式叫做aignable是吧?啊通过这样个方式呢,我们就可以什么进行指定以及排除的这这个操作了,这个都没办法,OK好吧,呃,那么在这个使用注解的时候呢,大家还需要注意一个问题是吧,就是必须要把一个a op的包给它导进来,我们在讲课的过程中,是不是也给大家演示出来了这个问题了,对吧?啊,那么我们看到了以后呢,你就得明白啊,原来我是少了一个包,然后呢,你再把这个包呢给它加入进去,那就没有什么问题了,听到了吧,那下一个话题呢,就是我们的组件装备了,那也就是我们的autob这个注解的一个用法了,主要讲的就是它,那么现在大家能理解这个auto。
13:52
表团的工作机制了吗?嗯,能不能差不多吧?哎,就是我们来说的啊,先通过by tap的方式呢,进行装配,假如说我通过by tap,我能唯一确定下来一个,那么我就直接装配成功了吧,哎,如果说我匹配到了多个兼容类型的病了,那么这个时候呢,它还会尝试着使用by name的方式来再进行什么确定一下,假如说我能确定下来,那我就装配成功,如果说我确定不下来呢,那就装配失败了,他就只能抛出异常了,是吧,这是他的一个工作机制啊,那么其实我们也可以啊,再帮助他呢去确定一下,就是使用一个coli fair,那个注解还记不记得对吧?使用那个扣fair啊,这里面有没有有。
14:40
啊在哪来着,在上面啊在这是吧?啊看不见了是吧?啊,我这个视图应该切到这个视图好看一点是吧?啊一样的啊差不多,然后呢,就是呃,通过一个这个扣Li fair啊这个注解的进一步的去指定一下你要装配的这个B的这个ID值对吧?但是基本上的话呢,我们在实际的开发中,这个东西是很少会去用的,我们不会说让他这个同时存在这个多个兼容的,很少会有这种情况,基本上都是什么呀,一个对诶一个对应一个,然后呢,你直接进行装备就行了,明白吧,所以说我们在讲课的时候呢,给大家讲了各种各样的情况,但是我们在实际写代码的时候,我们是没有那么多种情况的,你就正常去写的话,就是一个组件对应一个组件,然后呢,你直接注解进行装配就可以了,明白了吧?啊呃,那这个奥贝的话呢,还有一个问题就是冒烟情况下必须被装配啊,如果说我找不着的话。
15:40
啊了,他也会报一个错对吧?这两个错你可以对这个放到一起来记哈,如果既然匹配到多个,它会报一个什么错来着,哎,我希望是单个匹配,但是呢,我找到了多个对吧,如果说一个都找不着呢,他报的一个措施,我希望最少得有一个能被进行装配吧,是不是?哎,这两个之你就可以放到一起来记了,明白吧?所以说呢,对于这个奥药来讲,多了也不行,少了呢也不行。
16:10
明白吧,那如果说当我这个装配不了的时候,我希望你不要报这个错,那你不要进行装配就行了,那么这个时候我们可以通过一个require等于false来去设置一下它的这个不是必须的,明白了吧,啊行吧,那我们把这个O呢又来给大家什么具体的说了一次啊,然后呃,像与这个autovi啊,功能相似的,像我们这个resource或者是这个inject这两个注解的话呢,大家可以啊了解一下就行了,我们基本上是不会再去用它的,能听懂了吧,哎,基本上不会再去用它啊好,来吧,再来往后看,呃,下面的话呢,我们就要来说一下,诶,我们讲的这个AOB了啊呃,SPAOB呢,我们暂时还没有去讲啊,但是呢,我们讲的是AOB前奏啊,就是我们在讲这个AOB之前呢,啊,我们在讲这个AOB之前呢,我们研究了一个很重要的一个问题。
17:10
就是我们的动态代理这个问题还记得吧,OK,这个是我们昨天讲的,应该说是最最重要的一个点了啊,动态代理然后我们花的时间呢,也比较长啊啊首先呢,我们是通过一个案例来去给大家讲解的啊,就是我们先写了一个基本的案例啊,然后呢,分析了一下,总结了一些问题出来啊,那这个问题的话,我们就总结到这儿,然后接下来呢,我们就诶使用一个动态代理的技术呢,去解决这个问题啊。呃,这个问题应该都都还记得吧,啊,这个我这边不再多说了啊,那么这个动态代理的话呢,我们主要来说一下代理的这个思想,代理的这个原理,大家现在应该都能理解了,对吧?昨天一下午了肯定是能理解了,主要来说一下我们这个代理怎么去做哈,呃,首先你要明确你现在使用的是哪种方式进行代理的,比如说你是基于接口的,那么你就必须得有接口,如果说你没有接口,你还想完成代理,那么你就必须要基于继承来去做啊,你就可以使用这个CD lib或者是我们的Java system啊来去什么做这个事。
18:15
能能理解吧,好,那我们昨天呢,主要是呃,基于这个接口啊,也就是我们使用的JDK的一个动态代理来去完成的这个工作。那么我们再来想一想哈,这个JDK的动态代理,我们在写的时候,哎,最关键的一个类,还有一个接口,大家还记不记得。记不记得哎类是不是啊,还有一个呢,哎是不这个接口啊,对吧,这个东西你一定要记住对吧,你提到JDK的动态代理这两个东西是必不可少的啊,Pro呢,主要是来帮我们去生成一个代理类啊,或者说我直接给你一个代理对象都行,我们两种方式是不是都给大家讲过了,对吧?而那个英文可handle德了呢,他就是来完成动态代理的一个整个过程的,你代理你到底要做什么事,就是在这个invocation handler里面的引work方法里面去做的。
19:13
这个都能理解了吧,OK,好,然后呢,呃,昨天我们在写这个代码的时候呢,我们来继续来看一看啊,再把一些比较重要的东西呢,给大家去强调一下啊,在这个process里面。好,我们就来看第一个吧,呃,在写它的时候呢,我们主要关心的啊,就是哪几个东西啊,注意pro里面的一个方法叫做new process,就是呢,直接给你返回一个代理对象啊,那么我们再去用它的时候呢,我们需要给一个类加载器,就是来帮我们去加载你动态生成的那个代理类,在注意了在这啊呃,下一个的话呢,我们需要给定他我目标对象所有的接口,我需要告诉他,只有这样的话呢,我才能去帮你代理你里面的一些方法,这个也是能理解的吧。好,第三个因我handle了,这是一个接口类型的,那么我们在写的时候呢,直接通过一个匿名内部类来去完成的,这个现在能看懂了吧,OK,然后大家一定要注意啊,就是我昨天问过你们的问题。
20:19
执行这个方法的时候,这个是不会执行的。现在能理解了吧,啊,其实大家一定要你时刻记住方法是什么时候执行的呀,被调用才会执行对不对,你不调用永远不会执行是吧?啊,你一定要把这个面向对象里面,我们最关键的一些点啊,最核心的一些点,你要记得特别清楚,理解的特别清楚。对吧,你只要把这些东西呢,掌握的特别清楚了,你再去分析一些问题的时候,诶,你就可以利用你所记住的东西,迅速的诶把这个问题给他什么排除一下,解决一下。对吧,所以说呢,我当初问你这个问题的时候,你应该直接就想到,那这个是个方法,他不调用怎么会执行呢?你看我执行它的时候,压根就没有调用过他,他肯定是不会执行的,对不对啊,所以这个的话,你一下就能把它什么确定出来了,不会执行。
21:12
啊,但是我们需要注意啊,那这个方法是什么时候执行的呢?就是代理对象去调用代理方法的时候,它会回到我们的inwork方法上面来去执行,那么具体的原因是什么呢?就是给大家去说的,在代理类里面的这个代理方法中有一行代码叫做super.h DR in work,这个是昨天带着你们去看过的吧,对吧,从这个地方呢,诶,它就又调用回来了我们的in work这个位置,那么也就意味着从我们具体执行的角度上面来讲,我在这个位置去调用的是ADDDD方法,那其实我们是心里面知道这是一个代理对象,但是对于一些这个普通的用户来讲,我把这个整个的代理过程,我给他什么稍微的封装封装,对吧,稍微的封装一下,他拿到了这个代理对象,他其实是不知道的,他以为我拿到的还是一个什么呀,就是我原本的那个对象,其实我们在讲AO的时候,就是这样的一个现象,然后呢。
22:12
那去调ADDDD的时候呢,他感觉就是应该掉到什么呀,掉到我这个具体类里面的那个ADDD里面了,但其实不是的明白吧,他从这个地方呢,诶就要干什么呢,就要来到我们的,哎,来到我们的什么代理类里面去执行我们的这个方法,然后呢,进而呢,就来到了这个影work这个位置去执行我们的这个方法,而在这个影work里面,我们才把这个方法的调用转回到了我们最终的这个目标对象上面。能明白了吧,然后这样的话呢,我们就可以在目标对象方法啊,目标对象的这个方法执行的前后啊,我们去加一些什么日志的记入,就可以去实现这个功能了,听明白这个意思了吧,OK,当然啊,我们在讲课的时候呢,是基于这个日志的这个需求去讲的,那你说动态代理就只能去做日志吗?是是不是这样的,动态代理只能做日志吗?不是不是啊,这个大家一定不要理解错了,以前有同学说这个讲完这个以后呢,我们又去强调啊,等后续我们再遇到动态代理的时候说,诶,怎么动态代理还能做别的事儿呢?是吧,那当然是可以的了,明白了吧?啊说这个大家不能被这个案例给你什么局限做啊,你该明白代理呢,它就是一个什么设计的一个什么模式,对不对,我可以做任何事的,只不过我们现在呢,是基于这个日志的这个需求来去给大家去讲解啊,这个你一定要理解清楚了啊。
23:38
OK啊啊,那这个时候我们需要呃注意的一个问题啊,然后呢,别的的话呢,应该也就啊没啥了哈,你主要是能把我们这个掌握的这个代理的这个底层的实现啊,它是怎么去调用的,那把这个理解清楚了,那么基本上像这个东西再写的话呢,也就没啥区别,没啥难难度了,对吧,你就记住这么几个方法,是不是这里面他要什么你就给他什么啊,那你一步一步就能把它写出来了。
24:06
听懂了吧,OK好吧,呃,那我们这个动态代理呢,给大家讲完了,呃,那你说我们在实际的这个工作中,呃,这个东西写的多不多啊。多不多,多不多呀,啊,其实不是很多能明白吧,其实不是很多,因为什么呢?因为呃,我们已经有一些现成的技术,就是通过这个动态代理,他已经帮我们提供出来一些更加好用的一些技术了,像我们讲的这个spo a op就是这个样子的,所以说呢啊,在这个实际的工作中啊,特别是对于一些这个比较呃基层的一些这个程序员来讲,他很少能写到这些代码。明白吧,而且这些代码再结合上我们实际的业务来讲的话呢,还是有一些难度的,可能对于他们来讲,超出了他们的这个能力范围了,能明白吧,所以说这个东西呢,写的并不是很多,但是如果你要是呃做这个整个架构的是吧,就做这整个这个项目的一个什么啊,前期的这个架构的啊,架构设计的,那么你肯定是要用到这个东西的,明白吧,啊,你在这个项目里面,如果你这个架构想做的更加的灵活一点,更加的好一点,那么像这个动态代理的这个模式啊,基本上都是会用上的。
25:23
听懂了吧啊,但是对于我们来讲的话呢,大家知道知道这个代理怎么去写,然后呢,你把接下来我们要讲的po这个a op,把它好好的去学一学啊,就没啥没有什么太大问题了,明白了吧啊行吧,呃,那我们就先回顾到这儿啊,然后接下来的话呢,我们就来讲解我们point的这个a op啊。
我来说两句