大致内容
- 如何让工厂模式同时创建其关联模式实现通用
- 解决创建一个对象时 把其关联对象也创建好。
- 代理对象解决事务管理
- 权限的控制
- 自定义注解
- 反射机制
- 两个文件 :factory.Properties和ApplicationContext.xml。
- 通用:不出现任何类 通过字符串 在堆区的大Class对象找到方法,并调用。
- 工厂层 事务 代理 全部动态即通用设计。
- 动态工厂(动态生产实现类对象和代理类对象赋给实现类接口)
- 通过MyInnvactionHandler类 根据注解 选择不同处理方式handler,生成代理类对象时引入处理方式。
- 返回类型Object,需要具体类型自己换 eg:(IRegisterServiceDao)Factory.getProxyInstance(“RegisterServiceDao”);
反射
- 封装类的结构信息
- Student s=new Student();
- 1 硬盘-静态方法区
- 2 堆区创建封装啦这个类的信息的对象 继承信息 父类方法 大Class对象
3种得到大Class对象的方法
- Class c1=Student.class;//获得大Class对象
- Class c2=s.getClass();
- Class c3=Class.forName(“com.whgc.model.Student”)//最通用,不用创建对象
大Class封装啦所有信息(类的信息的对象 继承信息 父类方法 注释方法 只要是这个类improt的其他类 在大Class对象中都可以找到)
- Field(成员变量) Constructor(构造方法) Method(成员方法)
1 | PrivilegeAnnotation p= m.getDeclaredAnnotation(PrivilegeAnnotation.class); |
自定义注释(通过反射实现:字符串在大Class里面找): 通过方法提供属性
1 | - 注释在引用类的表现方式:类当方法用,方法当属性引用 |
1 | (RetentionPolicy.RUNTIME) |
1 | public class StudentDao implements IStudentTDao { |
java框架:权限的控制 (反射机制 实现权限管理) 事务控制session
ApplicationContext.xml
- 类似factory.prppretise 用于根据id创建对象。
- 区别:
1 | <bean id="userdao" class="org.whgc.UserDao"></bean> |
实操
反射机制 完整源码
- 根本是通过字符串拼接在堆区的大class对象找到所需要的方法。
- 获取大class对象有三种方法
- newInstance()创建大Class对象实例
- getDeclaredMethods()获取其方法
- invoke()调用其方法
- 全程没有创建一个对象,却完成啦创建对象可以完成的所有操作,更改Class.forName()就可已完成对一个类对象的操作。达到通用的目的。
1 | /* |
用反射实现通用工厂方法(需配合配置文件)
- 需要配置文件factory.proprieties(就是ssm中的ApplicationContext.xml)。
- 通过静态块把配置文件key value 传给 Properties对象 props
- 在factory.proprieties中key可以随便写,为什么?
- 传入字符串通过key获得value(类字符串)用于创建对象
- 通过key获得value(类字符串)用于创建对象,创建实现类dao对象并返回,全程没有出现某个具体类的创建,实现啦通用工厂。
1 | class Factory{ |
如何在其他类方法中使用注解
- 注解类引入时当方法用,方法当属性用。
1 | class StudentDao{ |
注解何用:权限控制 事务控制用session(封装啦Connection对象和statement对象)
- 反射调用方法时如何加载注释 实现权限控制。
- 加载注释,得到roles进行判断。
1 | class Test{ |
用反射实现通用代理 如何自定义异常 使用异常
- 如何自定义异常
- 使用自定义异常
1 | public class MySqlException extends RuntimeException { |
解释一波ApplicationContext.xml和factory.properties的区别。
- factory文件只能通过实现类字符串找到其实现类。
- ApplicationContext文件能通过实现类字符串找到其实现类并找到与其关联的类。
- ApplicationContext文件要完成他的工作必须导第三方jar包。
1 | factory.properties: |
ApplicationContext.xml的使用与factory.properties不同。
1 | private static Properties props=new Properties(); |
现在来实现动态代理(所有类的可以使用的生产代理类的方法) 并用MyInnvactionHandler类加权限控制
- 完整源码
- 全程没有new 新建对象。
- 关键:MyInnvactionHandler类 和Factory的getProxyInstance(String name)方法。
- 有啥用?写一个=写啦无数个,效率高。
- 顺便温习下通用工厂 动态代理还是用工厂实现
- 如此,我们的工厂就两个通用方法:通用生产实现类对象的方法 & 通用生成实现类代理类的方法。
- 如果用的是ApplicationContext.xml文件的话,不用static块啦。
- MyInnvactionHandler类用于对代理类加处理方式eg:权限控制。
- iud->u 和RegisterServiceDao中的getU()有关?
1 | /*1.传入实体类字符串到Factory的getProxyInstance(String name)方法中 |
1 | class MyInnvactionHandler{ |
1 | public class Factory { |
动态代理实现权限控制(简易版思路)
- 1.新建对象并设置role ,存入Application类的user对象。
- 2.在MyInnvactionHandler类中引入实现类对象并获得方法注释roles与Application中的role做比较。
- 3.如果role在roles[]中 则可以调用该方法,反之则抛出异常。
反射机制实现事务控制
- 1.对ServiceDao实现权限控制
- 2.然后在里面写事务不就完成啦对事务的控制。
- 3.权限控制包括:一般方法控制,事务控制等。