Spring boot实现一个简单的ioc(1)

前言

跳过废话,直接看正文

之前参与开发的几个spring的项目,用的版本都3.x, 最近忽然发现spring 5 都快上线了,于是赶紧去关注了下spring的最新动态。发现了spring-boot这个好东西(终于可以从各种错综复杂的xml配置文件中解放出来了!)。

在学习了目前最新的1.5.2.RELEASE版spring-boot官方文档之后,我决定仿照spring-boot的项目结构以及部分注解,写一个简单的ioc容器,一方面为了加深自己对ioc的理解,另一方面也为了以后在开发一些个人项目需要简单的使用一些自动装配功能时,可以直接使用这个ioc容器,而不用引入庞大的spring。

正文

在写正式代码之前,先写好测试代码,看看用这个ioc具体该做什么。

测试项目结构

sample 

SampleApplication.java
     runner
         SampleApplicationRunner.java

model
        BeanA.java
        BeanB.java
        BeanC.java

SampleApplication

作用

项目的启动入口。

代码

import com.clayoverwind.simpleioc.boot.SimpleIocBootApplication;
import com.clayoverwind.simpleioc.boot.SimpleIocApplication;

@SimpleIocBootApplication
public class SampleApplication{

 public static void main(String[] args) {
  SimpleIocApplication.run(SampleApplication.class, args);
 }
}

说明

这个启动模式是照搬了spring-boot的启动模式,将启动任务委托给SimpleIocApplication来完成。ioc容器将根据注解@SimpleIocBootApplication的相关配置自动扫描相应的package,生成beans并完成自动装配。(如果没有配置,默认扫描SampleApplication所在的package及其子package)

SampleApplicationRunner

作用

ioc容器启动的监听类, 这个类实现了SimpleIocApplicationRunner。因此,在ioc容器自动装配完成后,将自动调用SampleApplicationRunner中的run方法。

代码

import com.clayoverwind.simpleioc.boot.SimpleIocApplicationRunner;
import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleBean;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;
import com.clayoverwind.simpleioc.sample.model.BeanA;
import com.clayoverwind.simpleioc.sample.model.BeanB;
import com.clayoverwind.simpleioc.sample.model.BeanC;

@SimpleComponent
public class SampleApplicationRunner implements SimpleIocApplicationRunner {

 @SimpleAutowired
 private BeanA beanA;

 @SimpleAutowired
 private BeanB beanB;

 @SimpleAutowired("beanC1")
 private BeanC beanC1;

 @SimpleAutowired("beanC2")
 private BeanC beanC2;

 @Override
 public void run(String[] args) throws Exception {
  beanA.print();
  beanB.print();
  System.out.println(beanC1.toString());
  System.out.println(beanC2.toString());
 }

 @SimpleBean("beanC1")
 private BeanC createBeanC1() {
  return new BeanC("I am bean c1!");
 }

 @SimpleBean("beanC2")
 private BeanC createBeanC2() {
  return new BeanC("I am bean c2!");
 }
}

说明

SimpleIocApplicationRunner 参考了Spring-boot中的ApplicationRunner。
@SimpleComponent作用于类,对应spring中的@Component
@SimpleAutowired只能作用于字段(实现相对简单),组合了spring中的@Autowired以及Qualifier的功能
@SimpleBean作用于方法,根据方法返回值来生成一个bean,对应spring中的@Bean

BeanA

说明

一个简单的bean。

代码

import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;

@SimpleComponent
public class BeanA {
 private String content;

 @SimpleAutowired
 private BeanB beanB;

 public BeanA(){}

 public BeanA(String content) {
  this.content = content;
 }

 public void print() {
  System.out.printf("[BeanA].beanB = %s\n", beanB.toString());
 }
}

BeanB

说明

一个简单的bean。在这里可以看到,BeanA依赖BeanB,而BeanB也依赖BeanA,这就产生了一种依赖循环。这种依赖循环比较常见,因此ioc容器要能够解决这种问题。

代码

import com.clayoverwind.simpleioc.context.annotation.SimpleAutowired;
import com.clayoverwind.simpleioc.context.annotation.SimpleComponent;

@SimpleComponent
public class BeanB {
 private String content;

 @SimpleAutowired
 private BeanA beanA;

 public BeanB(){}

 public BeanB(String content) {
  this.content = content;
 }

 public void print() {
  System.out.printf("[BeanB].beanA = %s\n", beanA.toString());
 }
}

BeanC

说明

BeanC并没有加@SimpleComponent,因此ioc容器不会自动为该类生成一个bean。这个类的主要是用来测试@Bean
(见SampleApplicationRunner 中的createBeanC1()和createBeanC2())。

代码

public class BeanC {
 private String content;

 public BeanC(String content) {
  this.content = content;
 }

 @Override
 public String toString() {
  return "BeanC.content = " + content;
 }

}

后记

有了测试代码,接下来便要开始实现这个简单的ioc容器,详见下一篇博客。
完整代码参考:https://github.com/clayandgithub/simple-ioc

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring学习笔记1之IOC详解尽量使用注解以及java代码

    在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4. 一.准备工作. 1.m

  • Spring boot实现一个简单的ioc(2)

    前言 跳过废话,直接看正文 仿照spring-boot的项目结构以及部分注解,写一个简单的ioc容器. 测试代码完成后,便正式开始这个ioc容器的开发工作. 正文 项目结构 实际上三四个类完全能搞定这个简单的ioc容器,但是出于可扩展性的考虑,还是写了不少的类. 因篇幅限制,接下来只将几个最重要的类的代码贴出来并加以说明,完整的代码请直接参考https://github.com/clayandgithub/simple-ioc. SimpleAutowired 代码 import java.la

  • MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3

    到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码: private IUserService _userService; private IUserService UserService { get { return _userService ?? (_userService = new UserService()); } set { _userService = value; }

  • spring的IoC和DI详解

    这里先来简单介绍下IoC和DI的区别: IOC:翻译过来是控制反转,将对象的创建权由Spring管理,HelloService不需要自己去创建,Spring可以帮你创建. DI:依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中. 我们现在编写的类是没有其它的属性的,如果你学过UML这种设计的话,面向对象中对象中的几种关系 简单来书,IoC更像是一种思想,DI是一种行为. 另一种说法是,ioc是目的,di是手段.ioc是指让生成类的方式由传统方式(new)反过来,既程序员不调用n

  • Spring核心IoC和AOP的理解

    spring 框架的优点是一个轻量级笔记简单易学的框架,实际使用中的有点优点有哪些呢! 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于

  • 利用Spring IOC技术实现用户登录验证机制

    利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户的用户名和密码进行匹配. 当用户名与密码匹配成功时,跳转到登录成功页面:当用户名与密码不匹配时,跳转到登录失败的页面. 1.创建 User 对象,定义用户名和密码属性,代码如下: package com.importnew; public class User { private String us

  • Spring boot实现一个简单的ioc(1)

    前言 跳过废话,直接看正文 之前参与开发的几个spring的项目,用的版本都3.x, 最近忽然发现spring 5 都快上线了,于是赶紧去关注了下spring的最新动态.发现了spring-boot这个好东西(终于可以从各种错综复杂的xml配置文件中解放出来了!). 在学习了目前最新的1.5.2.RELEASE版spring-boot官方文档之后,我决定仿照spring-boot的项目结构以及部分注解,写一个简单的ioc容器,一方面为了加深自己对ioc的理解,另一方面也为了以后在开发一些个人项目

  • 用java的spring实现一个简单的IOC容器示例代码

    要想深入的理解IOC的技术原理,没有什么能比的上我们自己实现它.这次我们一起实现一个简单IOC容器.让大家更容易理解Spring IOC的基本原理. 这里会涉及到一些java反射的知识,如果有不了解的,可以自己去找些资料看看. 注意 在上一篇文章,我说,启动IOC容器时,Spring会将xml文件里面配置的bean扫描并实例化,其实这种说法不太准确,所以我在这里更正一下,xml文件里面配置的非单利模式的bean,会在第一次调用的时候被初始化,而不是启动容器的时候初始化.但是我们这次要做的例子是容

  • 使用Spring来创建一个简单的工作流引擎

    文章来源:matrix 作者:Steve Dodge 摘要 spring是支持控制反转编程机制的一个相对新的框架.本文把spring作为简单工作流引擎,将它用在了更加通用的地方.在对工作流简单介绍之后,将要介绍在基本工作流场景中基于Spring的工作流API的使用. 许多J2EE应用程序要求在一个和主机分离的上下文中执行处理过程.在许多情况下,这些后台的进程执行多个任务,一些任务依赖于以前任务的状态.由于这些处理任务之间存在相互依赖的关系,使用一套基于过程的方法调用常常不能满足要求.开发人员能够

  • 模仿Spring手写一个简易的IOC

    这个小项目是我读过一点Spring的源码后,模仿Spring的IOC写的一个简易的IOC,当然Spring的在天上,我写的在马里亚纳海沟,哈哈 感兴趣的小伙伴可以去我的github拉取代码看着玩 地址: https://github.com/zhuchangwu/CIOC 项目中有两种方式实现IOC: 第一种是基于dom4j实现的解析XML配置文件版 第二种是基于自定义注解实现全配置版 全注解版 模仿Spring原生的IOC机制如下: Interface类型的beanDefinition不会被实

  • Spring Boot 排除某个类加载注入IOC的操作

    Spring Boot 排除某个类加载注入IOC 我们项目往往会引入其他项目的依赖,造成功能冲突的类,我们想把这些类排除掉,不注入到我们项目IoC容器中, 只加载自己的类 @ComponentScan(basePackages = "com.xxx",excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = { xxxPublisher.class, xxxAdvice.cl

  • 使用Spring boot标记一个方法过时

    这篇文章主要介绍了使用Spring boot标记一个方法过时,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 添加注解:(虽然被标记为过时,但是仍然可以继续使用) @Deprecated @Deprecated public List<TestData> selectTestDataListById(String id) { Map<String, String> params = Maps.newHashMap(); params

  • 利用Spring boot如何创建简单的web交互应用

    关于页面渲染 其实在工作中,一直都是前后端分离,也就是说,我的工作从来都是提供接口,而不写 html css js 之类的,所以在这方面也没有经验. 这里为了给大家介绍下模板引擎,我将会写个非常非常简单的页面,如果不好看,请见谅~ Spring Boot 官方推荐的模板引擎是 Thymeleaf ,点击可以进入其官网了解详情. 本章目标 让 Spring Boot 应用可以访问到静态资源文件 创建用户登录表单,并对用户名.密码进行校验 校验失败,将返回登录页,并展示错误信息 校验成功,重定向到苹

  • 使用Spring Boot创建Web应用程序的示例代码

    在这篇文章中,我们将探讨使用Spring Boot创建Web应用程序的细节. 我们将探索Spring Boot如何帮助你加速应用程序开发. 我们将使用Spring Boot构建一个简单的Web应用程序,并为其添加一些有用的服务. 1. 介绍 启动一个新项目的主要挑战之一是该项目的初始设置. 我们需要对不同的目录结构进行调用,并且需要确保我们遵循所有行业标准.对于使用Spring Boot创建Web应用程序,我们需要以下工具: 我们自己喜欢的IDE (我将使用IntelliJ) Maven JDK

  • 只需两步实现Eclipse+Maven快速构建第一个Spring Boot项目

    随着使用Spring进行开发的个人和企业越来越多,Spring从一个单一简介的框架变成了一个大而全的开源软件,最直观的变化就是Spring需要引入的配置也越来越多.配置繁琐,容易出错,让人无比头疼,简化Spring配置简直可以说是民心所向. Spring Boot是由Pivotal团队提供的一个基于Java的全新的开源框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.如今,Spring Boot逐渐成为快

随机推荐