spring的两大核心是IOC(控制反转)和AOP(面向切编程),首先我们先研究下什么是反射。
反射
在传统的开发过程中,对象是程序使用使用new创建出来的;但是在spring中是通过IOC容器创建,再推送给调用者。
IOC运用反射机制和工厂模式的概念
1.什么是反射。官方给出的定义是:反射是java语言的一个特性,他允许程序在运行时来进行自我检查并且对内部的成员进行操作。例如他允许一个java类获取他所有的成变量和方法并显示出来。在java中,只要知道了类的名字,就可以通过反射机制获得类的所有信息。当然,反射机制不止是java有
2.反射有什么作用。在运行时(编译时获得java对象的属性、方法、构造方法。
3.反射机制的优缺点。优点:可以动态地实对象的创编译。使用反射是一种解释操作,用于字段和方法接入时比普通程序慢的多。因此建议用在灵活性和扩展性要求较高的程序上。反射绕过了源代码的逻辑,为程序的可维护性带来了一定的影响。
4.常用的方法。
getName()获得类的完整名字
getPackage()获取此类所属的包
getSuperclass()获得此类的父类对应的Class对象
getField(String name)获得类的指定属性
getMethods()获得类的public类型的方法
getMethod (String name,Class [] args)获得类的指定方法
spring中IOC实现原理。
1.如果我们不用反射机制实现工厂模式可以这样写:
interface Worker {
public abstract void work();
}
class Coder implements Worker {
public void work() {
System.out.println("I am coding.");
}
}
class Leader implements Worker {
public void work() {
System.out.println("I am talking.");
}
}
// 构造工厂,以后如果新增工种,在该方法中添加
class Factory {
public static Worker getInstance(String workerClassName) {
Worker worker = null;
if("Coder".equals(workerClassName)){
worker = new Coder();
}
if("Leader".equals(workerClassName)){
worker = new Leader();
}
return worker;
}
}
// 测试类
class Test {
public static void main(String args[]){
Worker worker = Factory.getInstance("Coder");
worker.work();
}
}
上述写法存在一定问题:当新增工种时,如Trainer时,除了要新增一个Trainer类,同时还要去修改构造工厂的方法。
2.如果用反射机制的话则可以避免这个问题,如下:
interface Worker {
public abstract void work();
}
class Coder implements Worker {
public void work() {
System.out.println("I am coding.");
}
}
class Leader implements Worker {
public void work() {
System.out.println("I am talking.");
}
}
// 构造工厂
class Factory{
public static Worker getInstance(String ClassName) {
Worker worker = null;
try{
worker = (Worker)Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return worker;
}
}
// 测试类
class Test {
public static void main(String args[]){
Worker worker = Factory.getInstance("worker.Coder"); // worker为Coder所在包名,此处传入的是该类的完整路径
if(worker!=null) {
worker.work();
}
}
}
该方法仍然存在问题:通过类名创建对象时,需要传入完整的包名和类名。有哪些类可以被创建也并不直观。
3.下面我们看看使用反射机制并结合属性配置文件的方法(IOC)应该怎么写:
首先是属性配置文件,一般以xxx.properties的格式命名,此处为worker.properies
coder=worker.Coder
leader=worker.Leader
然后是主类的编写
interface Worker {
public abstract void work();
}
class Coder implements Worker {
public void work() {
System.out.println("I am coding.");
}
}
class Leader implements Worker {
public void work() {
System.out.println("I am talking.");
}
}
// 操作属性文件类
class init{
public static Properties getPro() throws FileNotFoundException, IOException{
Properties pro=new Properties();
File f=new File("worker.properties");
if(f.exists()){
pro.load(new FileInputStream(f));
}else{
pro.setProperty("coder", "worker.Coder");
pro.setProperty("leader", "worker.Leader");
pro.store(new FileOutputStream(f), "WORKER CLASS");
}
return pro;
}
}
// 构造工厂
class Factory{
public static Worker getInstance(String ClassName) {
Worker worker = null;
try{
worker = (Worker)Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return worker;
}
}
// 测试类
class Test {
public static void main(String args[]){
Properties pro=init.getPro();
Worker worker = Factory.getInstance(pro.getProperty("coder")); //
if(worker!=null) {
worker.work();
}
}
}
把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。









网友评论