SSM包括:
SSM包括:
09:04
因为xml文件中配置service的时候需要ad,u而就是AccountDao,所以需要渠道AccountServiceImpl.java中给ad一个set方法。
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)
以事务方式运行,是说如果执行多条SQL语句,则要么都成功,要么都失败
以非事务方式运行,是说如果执行多条SQL语句,彼此没有关系
例如
执行以下三条语句
SQL1
SQL2
SQL3
执行三条语句是1、2成功了,3失败了
如果是事务方式:则1、2的执行结果会被撤销,即三条语句都不成功
如果是非事务方式:则1、2执行成功,3失败!
利用spring(xml文件)读取外部db.properties
弄清楚依赖关系,然后从后往前进行配置。
07:32
33行代码:泛型为返回值:User
new BeanHandler在dbutils中自动配置好,而RowMapper在JdbcTemplate中需要手动配置:如38行-46行;
*com.sikiedu.service.*ServiceImpl.*(...)
第一个*表示对返回值不做要求,可以用*代替void等。(权限默认为public,所以public可以省略)
第二个*表示要增强service包下所有以ServiceImpl结尾的实现类;
第三个*表示增强类下的所有方法;
...:参数了类型有可能不同,数量可能不止一个,所以可以用...代替。
aop里面用到的名词:
JoinPoint连接点:哪些方法会被拦截?被增强的方法都会被拦截;
PointCut切入点:假如我想增强save方法,save方法就是切入点;
Advice:通知/增强(在编译前加入),他是我们代理代码中的:
Introduction:介入/引入(在编译执行期加入),运行时加入的方法或行为;
Aspect:切面,通知+切入点,将会通知应该应用到哪个切入点;
target:目标,被代理的对象,比如上图中的UserServiceImpl;
weaving:织入, 把切面的代码应用到目标对象来创建新的代理对象的过程;例如图中:把“开启事务”放在save方法的前面,把“提交/回滚”放在save方法的后面。
proxy:代理,把切面的代码应用到目标对象来创建新的代理对象;
也就是说,通过weaving这个过程,它会生成一个新的增强后的代理对象。
07:54
new一个handler去实现这个接口
在Object invoke中,第一个参数可以当成无效(不看),method表示调用原始的方法,首先把args也就是要用的参数调用进去(进而把invoke中的arg1变成args),arg0表示被代理对象,需要传递进去,也就是us。
过滤器体现了aop思想:
纵向重复的代码:身份验证,利用过滤器横向抽取重复的代码出来:
每次请求都会创建一个新的容器,但是在web项目中我们只需要一个spring的容器。所以我们开始了“配置Spring随项目启动”:
利用
@Run with(SpringJUnit4ClassRunner.class)//使用junit进行测试,帮我们创建容器
@ContextConfiguration("classpath:applicationContext_Injection.xml")//读取配置文件
两处注解,可以解决日后有太多test导致新建容器代码重复过多
以防注解较多,可以利用在一个xml文件中引入另一个xml文件,从而使用另一个xml文件中的bean或其他标签。5:40
利用@Value这个注解完成对属性值的注入
注:建议在set方法上面对属性值的注入,因为直接在private前面注入的话,也就是在引入字段的前面注入,会破坏这个字段的应用范围(private、public),这个时候其实用的是暴力反射注入。
注解开发:(可以通过注解把一个xml文件的标签用到另一个xml的java文件中)
解释:图中@Scope中,scope标签属于applicationContext.xml文件,但是这里运用注解的方式把它用到applicationContext_annotation.xml。
但是在视频的09:40中,要用useInit,要找到UseInit方法并在上面进行注解:
开启组件扫描的时候,需要传递一个包,它会扫描这个包中以及子包的所有类的注解。
要将User2交给spring管理:
@Controller() //对应web层
@Service() //对应service层
@Repository() //对应dao层
要想运行destroy-method方法,必须待容器关闭后方可:
init-method与destroy-method的使用:
一般用于后续代码项目开发的时候需要在bean中做一些初始化和销毁的逻辑。
但是如果scope是多例prototype,那么spring容器在创建完之后就会交给你管理,spring不会帮你进行管理,进而destroy不会执行。
init-method:容器创建对象之后立刻调用初始化fang'fa;destroy-method:容器销毁对象之前调用的方法。
1.单例:scope=“singleton”
2.多例:scope=“prototype”3.scope=“request”:request在web环境下,如果scope属性为request,那么这个对象被创建出来后,它的生命周期会与request请求一致(request请求完毕之后对象才会被释放)
4.scope=“session”:生命周期会与session请求一致
解决因为bean较多而造成内存过大的问题:
百度搜spring sts