天天看点

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

spring最核心的部分莫过于ioc和aop了,博主菜逼一枚,如果有哪里理解的不对或者代码上有瑕疵的地方欢迎大家指正,大家互相学习,还有就是这只是模仿一下spring思想,只是把事务管理和bean管理简单模仿一下,完全不代表spring,如果想深入理解请看spring源码,下面就开始我们简单的模仿,纯手打,觉得还行就赞一下吧~

这个项目不是web项目,只是一个简单的java项目,测试用junit,废话不多说了,下面上代码:

项目的目录结构:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教
菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

说明:图中划红线的部分都是核心部分

红线部分说明:

① beanfactory:所有bean的核心生成器(spring容器), ② connbean:jdbc连接生成器(没用连接池哦~)

③transaction:事务管理的代理类, ④ beans.properties:配置文件

其余的没划线的就是domain、dao、service、controller这些web基本层次结构,待会会说

主要几个类的代码:

① beanfactory:

上面的类可以通过配置文件来实例化不同的对象,符合ioc最基本的思想,下面让我们来看看配置文件beans.properties的内容吧:

这里面只有两句话,指定dao层接口对象的实现类的路径,其实已经很接近spring的xml里对bean的配置了,只不过这里是properties文件,简化了许多

② transactionproxy代理类:

说明:java在1.3版本的时候就为我们提供了一个用作代理类实现的接口invacationhandler,通过实现这个接口可以很随意的写一个耦合度特别低的动态代理类(即这一个代理类可以代理任何类)

③ connbean,用来生成一个数据库连接对象,在不用连接池的情况下,我们用threadlocal进行封装,代码如下:

以上就是核心的一些实现代码,下面让我们来看一下我们的业务吧:

实体类:user,userdetail,要求添加一个user的同时要添加一个userdetail

user:

userdetail:

dao层的接口和实现:

userdao:

userdaoimpl:

userdetaildao:

userdetaildaoimpl:

userservice:

usercontroller:

测试类:

ok,大功告成了,现在让我们用junit来测试一下吧:

service层不加

执行结果:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

可以看出来事务已经提交了,我们来看看数据库里面的变化:

tb_user表:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

user_detail表:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

然后在业务层加上

运行结果:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

仔细观察划绿色线的部分就能发现,事务已经回滚了,看数据库表也是没有记录的

我们主键id由于是递增的,因此我们还要确定一下事务是不是真的回滚了,我们把异常代码去掉,然后再往里面插入成功一次数据,运行后的数据库表记录如下:

tb_user:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

user_detail:

菜鸟简单模仿一下spring的ioc和aop思想,欢迎大家进来阅读指教

大家仔细看id,已经是3了,说明原来事务成功回滚了

说明:其实connection对象不必每次都作为参数传递给方法,这里只是为了更清楚的展示connection的流向,其实我们用threadlocal封装成一个单例的时候就已经注定了本次访问(即当前线程从controller层调用到dao层)所有get到的connection对象都是同一个;

最后,个人感觉这个程序有个非常要命的地方,就是我要给service层加事务代理,这样就导致了sevice层的对象不能通过配置文件来实例化,正在纠结中。。以后还会优化,这只是简单实现以下,真正的spring要复杂的多得多,第一次发表博客,以后也会多发一些,大家互相学习~