本文主要介绍Spring的IOC原理的简单实现,有一定的参考价值,有需要的朋友可以参考一下。
InversionofControl(缩写为IoC)
简单来说,当你需要一个对象的时候,你不需要手动创建一个新的,其他容器会为你提供。Spring是IOC容器。
例如:
在春天,经常需要在服务中装配一把刀。通常,使用@Autowired注释:类似这样
公共类服务实现{
@自动连线
道道;
public void getData(){
Dao . get data();
}
这里直接使用未初始化的Dao会报告空指针异常,所以Spring的做法是通过反射为你加载所需的类。
下面的例子模拟了Spring的DI和IOC。
首先,编写两个注释来模拟Spring的注释:
实体标注表示Spring的@Service。
@Target(ElementType。TYPE) //类
@保留(RetentionPolicy。运行时间)
public @interface实体{
}
它代表@春天自动编写
@Target(ElementType。FIELD) //描述该方法的
@ retention(retention policy . runtime)//仅在运行时保留
公共@接口资源{
}
创建注释后,再创建两个类:
Rain类表示需要从其他地方获取天气数据(数据库或服务器)
公共类雨{
公共虚空雨(){
System.out.println('下雨');//为了方便直接写。
}
}
天气类表示获取的天气数据。
@实体
公共类天气{
@资源
下雨下雨;//这里雨水是后面反射直接注入的。
public void weather_rain() {
rain . rain();
}
以下是反射直接注入:
首先遍历指定的包名:首先省略这一步,
首先构建一个用List模拟Spring的bean容器,也就是用已经初始化的实体注释初始化所有的类。
公共类Weather _ reflec {
listobjectobjectlist;
//模拟Spring容器
公共天气_反射(){
object list=new ArrayList object();
}
//其实这里最好的做法是先找出有标注的类,判断它有实体标注再传入。但为了方便直接省略了。
public void get_ref(Object object)抛出ClassNotFoundException、IllegalAccessException、InstantiationException、NoSuchMethodException、InvocationTargetException {
班级?clazz=object . getclass();
if(clazz . isanotationpresent(entity . class)){
//确定是否有实体注释。
field[]fields=clazz . getdeclaredfields();
//获取其变量
for(字段字段:字段){
if(field . isanotationpresent(resources . class)){
//确定是否需要注射。
班级?rain class=class . forname(field . gettype()。getName(),false,Thread.currentThread()。getContextClassLoader());
//在这里,首先加载Rain类
field.set(object,rain class . new instance());
//分配给rain
object list . add(object);
//最后,将指定的天气保存到容器中。
}
}
}
}
公共ListObject returnList(){
返回objectList
//返回容器供以后使用
}
最后,它直接用于模拟控制器。
公共类天气预报{
公共静态void main(String args[])引发ClassNotFoundException、NoSuchMethodException、InstantiationException、IllegalAccessException、InvocationTargetException {
weather prediction weather prediction=new weather prediction();
Weather Weather=(Weather)Weather prediction . springdo();
weather.weather_rain()。
//这里如果是普通的调用,会报告空指针异常,但是容器给它赋了变量rain,所以可以正常输出。
}
/*
模拟Spring启动过程,这一步其实可以单独写一个类,这一步是容器应该做的,我们不需要管。
*/
公共对象springDo()抛出ClassNotFoundException、NoSuchMethodException、InvocationTargetException、InstantiationException、IllegalAccessException {
Weather _ reflec Weather _ reflec=new Weather _ reflec();
//需要在启动时加载。
天气weather=新天气();
//扫描类批注后的新操作,然后进行下一步。
weather_reflec.get_ref(天气);
//对其类中的变量执行新操作,并将它们放入容器中。
object object=weather _ reflec . return list()。get(0);
返回对象;
}
后期操作输出:下雨了。
天气预报中没有新的降雨操作,但是可以使用。这应该是模拟Spring最简单的IOC例子了。当然Spring的IOC容器比这个强大很多,比如线程安全,各种细节。
总结
这就是本文关于简单实现Spring的IOC原则的所有细节。希望对你有帮助。感兴趣的朋友可以继续参考这个网站:
Spring IOC原理详解
简单理解Spring之IOC和AOP及代码示例
如有不足之处,欢迎留言指出。感谢您对本网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。