package com.learn.service;public interface UserService {public void add();}
package com.learn.service.impl;import com.learn.annotation.ExtResource;
import com.learn.annotation.ExtService;
import com.learn.service.OrderService;
import com.learn.service.UserService;//将该类注入到spring容器里面
/*** 就是UserServiceImpl这样一个bean* 我们现在使用的都是自定义注解* 只要是加上我们这个自定义注解之后* 那么这个时候他就会去注入bean的* 就会自动去获取bean* * * @author Leon.Sun**/
@ExtService
public class UserServiceImpl implements UserService {private UserServiceImpl() {/*** 我去打印这样一段话* 反射肯定是需要走构造函数的* */System.out.println("无参构造函数初始化......反射技术");}// 从Spring容器中读取bean/*** 为什我加上@ExtResource这么一个注解* 就可以获取orderServiceImpl这么一个对象* 是不是这样的* 这就是我要讲的原理的过程* 我把这个@ExtService注解给注掉* @ExtResource* private OrderService orderServiceImpl;* 这里还能取到吗* 还能不能取到* 能不能取到这个对象* 能不能取到OrderService* 肯定取不到* 为什么呢* 我们运行一遍* java.lang.NullPointerException* 是不是报了一个空指针* 我把@ExtService注解一加上去* 一加上去就可以运行了* 看到效果没有* 我来讲一下整个实现原理* 我今天还来讲一个知识* 什么知识呢* XML版本的* xml版本的可能稍微简单点* * * */@ExtResourceprivate OrderService orderServiceImpl;public void add() {/*** 这里会调用addOrder()* 是不是这样的* * */orderServiceImpl.addOrder();System.out.println("我是使用反射机制运行的方法");}}
package com.learn;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.learn.service.UserService;public class Test002 {public static void main(String[] args) {/*** SpringIOC使用了反射机制* 首先它在这里会去读取一个配置文件* 读取完了之后呢* 我会去解析bean的节点* 我会去拿bean的id* 是不是这样的* 我就可以把所有对象做一个初始化操作* 初始化完毕了以后呢* 别人只要传入userService这样的一个bean id* 我就让他去我的Spring容器去找我的id* 拿到这样一个对象* 是不是这样子* 那么这里有很多种做法* 比如我们通过UserService的bean的id* 让他去Spring的bean的节点去找到这个id* 找到这样的一个bean id以后* 获取到这样的一个class地址* 然后再使用反射机制* 去做这样的一个初始化* 那么这边我告诉你们* 解析xml要使用什么技术* 是不是DOM4J* 所以我告诉你们* 像SpringIOC的xml版本* 使用DOM4J加反射技术* 这是我们要说一下的* 可能关于XML解析有很多方式* 你们下去看一下* 我是怎么知道他这里面要用到反射技术呢* 我怎么知道他这个对象一定是反射创建的呢* 怎么做* 大家想一想* 我怎么证明他这个对象一定是通过反射创建出来的* 怎么证明* 有没有谁能够想起来的* 无参构造函数* 我在实现类里面一定要写一下无参构造函数* 运行* 无参构造函数初始化......反射技术* 看到没有* 无参构造函数初始化 反射技术* 这边我给你们讲一下* * 这个时候我们把构造函数改成私有的* private UserServiceImpl()* 我们要把它设置成私有的构造函数* 看一下这个效果* 运行* 能不能初始化* 照样可以* 我之前其实讲过的* 反射私有化还是可以运行出来的* 之前讲过的* 怎么可以设置权限的* 这个其实没用啊* 这个真没用* 你的构造函数或者方法私有化* 都能访问到的* 这个我就不去细说了* 这个过程聊不了解* 了解是吧* 我就花个十分钟去回顾一下* 就是怎么去解析这个XML* 然后我再给你去讲怎么去实现* 我跟你们讲一下* 我们可以按照我们自己的实现* 不一定是按照Spring的实现* 我给你写两套过程* 一套是什么呢* 一套是XML方式的* 就是他最开始是不会去创建对象* 当你需要的时候* 我才会去初始化对象* 我们写注解版本的时候* 只要他在调用构造函数的时候* 我就会去初始化这样的一个bean对象的* * */ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");/*** 这里打印一段话分隔一下* 你们看一下他是怎么实现出来的* 你们有没有发现相当于一个bean的对象* 你们看一下bean的对象是在什么时候进行初始化的* 就相当于你去加载new ClassPathXmlApplicationContext("spring.xml")这样的一个构造函数的时候* 他就会怎么样* 就会去初始化的* 而不是我去取的时候去初始化的* * */System.out.println("################################################################################");/*** 填你的bean id* 就是userServiceImpl*/UserService userService = (UserService) app.getBean("userService");/*** 把class的内存地址打印出来* com.learn.service.impl.UserServiceImpl@d7b1517* 是不是可以拿到class地址* * */System.out.println(userService);}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!