自定义注解@Bean和@Resource 实现SpringIOC

  在实际项目开发中,基本已经离不开spring框架了,而spring框架的成功之处在于起IOC以及AOP强大的解耦功能。今天给大家带来自己所简单实现的一个IOC注入。

  编写@Bean以及@Resource 注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bean {
	String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
	String value();
}

@Target标识此注解只能在类上使用

@Retention标识直到运行时态依旧能找到此注解

编写AnnotationUtil 方法类其中定义map做为springBean的容器,读取项目所有的类将类上标有@Bean注解的类放入到容器,以及resource注解注入方法

package com.skyyun.util;

import java.io.File;
import java.lang.reflect.Field;
import java.util.HashMap;

import com.skyyun.annotation.Bean;
import com.skyyun.annotation.Resource;

public class AnnotationUtil {
	/**
	 * bean容器
	 */
	private static java.util.Map<String, Object> Map;
	static{
		try {
			getAllBeansToMap();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * resource注解注入
	 * @param object
	 */
	public static void annotationIOC(Object object){
		Class clazz=object.getClass();
		//获取类的所有包括私有的属性
		Field[] Fields = clazz.getDeclaredFields();
		for (Field field : Fields) {
			Resource annotation = field.getAnnotation(Resource.class);
			if(annotation!=null){
				//允许改变私有属性
				field.setAccessible(true);
				String value = annotation.value();
				try {
					field.set(object, Map.get(value));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
	 * 获取此工程所有的bean存储到容器中
	 * @throws Exception
	 */
	private static void getAllBeansToMap() throws Exception {
		Map = new HashMap<>();
		getClassName();
	}

	/**
	 * 获取此项目中所有的java全路径名,
	 * @throws Exception
	 */
	private static void getClassName() throws Exception {
		// 获取到此项目的src路径
		String path = System.getProperty("user.dir") + "\\src";
		File files = new File(path);
		getClassFileName(files, "");
	}

	/**
	 * 获取所有类的全路径名,并把类初始化入容器
	 *
	 * @param path
	 * @param directoryName
	 * @throws Exception
	 */
	private static void getClassFileName(File files, String directoryName) throws Exception {
		if (files != null) {
			if (directoryName == null) {
				directoryName = "";
			}
			String name = null;
			File[] listFiles = files.listFiles();
			if (listFiles != null) {
			for (int i = 0; i < listFiles.length; i++) {
				if (listFiles[i].isDirectory()) {
					// 为目录
					name = listFiles[i].getName();
					File files2 = new File(files.getPath() + "\\" + name);
					if(directoryName.equals("")){
						getClassFileName(files2, directoryName + name);
					}else{
						getClassFileName(files2, directoryName + "." + name);
					}
					// System.out.println(name);
				} else {
					// 不为目录
					name = listFiles[i].getName();
					name = name.substring(0, name.lastIndexOf("."));
					if(directoryName.equals("")){
						setMap(directoryName + name);

					}else{
						setMap(directoryName + "." + name);
					}
				}
			}

			}
		}
	}

	/**
	 * 将带有@Bean初始化到容器
	 * @param name
	 * @throws Exception
	 */
	private static void setMap(String name) throws Exception{
		Class clazz=Class.forName(name);
		//查找此类上是否有此注解
		Bean bean = (Bean) clazz.getAnnotation(Bean.class);
		if(bean!=null){
			Map.put(bean.value(),clazz.newInstance());
		}

	}
}

编写测试类,以及测试方法

package com.skyyun.dao;

import com.skyyun.annotation.Bean;

@Bean("userDao")
public class UserDao {

	public void inserUser(){
		System.out.println("添加用户");
	}

	public void updateUser(){
		System.out.println("更改用户");
	}

	public void deleteUser(){
		System.out.println("删除用户");
	}

	public void selectUser(){
		System.out.println("查询用户");
	}

}
package com.skyyun.service;

import com.skyyun.annotation.Resource;
import com.skyyun.dao.UserDao;
import com.skyyun.util.AnnotationUtil;

public class UserService {

	public UserService() {
		super();
		//调用IOC方法注入
		AnnotationUtil.annotationIOC(this);
	}

	@Resource("userDao")
	private UserDao userDao;

	public void inserUser(){
		userDao.inserUser();
	}

	public void updateUser(){
		userDao.updateUser();
	}

	public void deleteUser(){
		userDao.deleteUser();
	}

	public void selectUser(){
		userDao.selectUser();
	}
}

编写测试类

package com.skyyun.test;

import com.skyyun.service.UserService;

public class Test {

	public static void main(String[] args) throws Exception {
		UserService service = new UserService();
		service.deleteUser();
		service.inserUser();
		service.updateUser();
		service.selectUser();
	}
}

运行此类最后得到结果

删除用户
添加用户
更改用户
查询用户  

总结

  此法使用io流读取当前项目所有的java文件,利用java自身的反射以及注解的方式实现springIOC,此方法还有很多不完善的地方,比如@Resource注入是在类的构造方法调用方法注入,并不能像spring那样完成注入。

原文地址:https://www.cnblogs.com/yzy4646/p/8410372.html

时间: 2024-08-05 18:08:20

自定义注解@Bean和@Resource 实现SpringIOC的相关文章

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired注入的对象一直有下划线提示,但是项目能运行,虽然不影响运行,但是强迫症的程序员肯定看不下去. 如何去除呢?解决:改变@Autowired的检查级别即可.快捷键:Ctrl+Alt+s,进入idea设置界面,输入inspections检索,如下: 原文地址:https://www.cnblogs.com

SpringMVC bean validator 自定义注解

有时候现有的验证注解满足不了部分业务需求,所以就有了扩展自定义注解. 1.添加注解类 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang

spring AOP自定义注解方式实现日志管理

转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven />     <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 -->     <conte

用户操作拦截并作日志记录--自定义注解+AOP拦截

作为运营除了处理系统生产问题,还要处理大量的用户上报事件,这部分工作占用了大量的人力.所有考虑把一部分事件查询处理做成一个自助平台,让用户自行核查处理.于是就有了用户自助系统.考虑到如何计量这个工具平台具体的实现价值,需要做用户操作统计才能给出可信服的数据. 以上就是本文的背景.自助系统的架构就是传统的springmvc+spinrg+mybatis+oracle.想到日志记录首先想到的就是AOP拦截处理.网上相关的技术贴很多.简单的小项目遇到的问题一般度娘都能给解决了~\(≧▽≦)/~ 自定义

spring AOP自定义注解 实现日志管理

今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven />     <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 -->     <context:component-scan base-pac

自定义注解框架的那些事

一.前言 距离上次更新已过一个半月,工作太忙也不是停更的理由.我这方面做得很不好,希望大家给予监督.首先会讲解[编译期资源注入],接着是[下拉刷新注入](通过注解来实现下拉刷新功能),最后打造一款[特色的注解框架]. 大家准备好公交卡了吗,开车了 - 二.什么是注解 每位童鞋对 注解 都有自己的理解,字面上的意思就是[额外的加入],在项目当中使用的注解的框架已经越来越多,如 : retrofit ,butterknife,androidannotations - 2017年Android百大框架

springmvc之自定义注解(annotation)

参考:日志处理 三:Filter+自定义注解实现 系统日志跟踪功能 1.项目结构 2.pom.xml,添加需要依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

自定义标签-自定义注解

首先是4个自定义注解类StaticResourceType.java public enum StaticResourceType { LESS,CSS,JS} StaticResource.java @Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface StaticResource { StaticResourceType type(); String path(); Dependenc

使用Spring处理自定义注解

使用Spring处理自定义注解 本文只讲思想,不讲代码. 可能的两种方法 spring schema spring aop aspect 参考1 dubbo service 包名:com.alibaba.dubbo.config 参考2 spring mvc 包名:org.springframework.web.servlet.config 可以参考这两个的实现,利用schema添加自定义注解并处理自己的注解,注册搜索模块. 源码分析 通过schema添加配置解析如: 在 spring配置文件中