`
747017186
  • 浏览: 329898 次
社区版块
存档分类
最新评论

Java自定义注解与spring BeanPostProcessor详解

 
阅读更多

之前写过Java的自定义注解,但是一直没有深入的去研究这个东西。下面就是我这几天研究的心得。

annotation的基础知识我之前的博客有,这里只讲例子:

Annotation注解的定义

类上的注解:

 

package anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)//类上的注解
@Retention(RetentionPolicy.RUNTIME)//在运行时有效
public @interface TypeAnnotation {
    /**
     * 类名称注解,默认值为类名称
     * @return
     */
    public String tableName() default "className";
    
    /**
     * 枚举例子
     * @author peida
     *
     */
    public enum EnumClassDemo{BULE,RED,GREEN};
    
    /**
     * 枚举例子属性
     * @return
     */
    EnumClassDemo getEnumClassDemo() default EnumClassDemo.RED;
}

 属性上的注解:

 

 

package anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)//属性上的注解
@Retention(RetentionPolicy.RUNTIME)//运行时有效
public @interface FiledAnnotation {
    /**
     * 字段名称注解,默认值为类名称
     * @return
     */
    public String fileName() default "fileName";
    
    /**
     * 枚举例子
     * @author peida
     *
     */
    public enum EnumFiledDemo{BULE,RED,GREEN};
    
    /**
     * 枚举例子属性
     * @return
     */
    EnumFiledDemo getEnumFiledDemo() default EnumFiledDemo.GREEN;
}

 注解支持类:

 

这里特别注意:要实现spring的BeanPostProcessor接口,这个接口里面有两个方法,

一个是实例化bean之前调用的方法postProcessBeforeInitialization

一个是实例化bean之后调用的方法postProcessAfterInitialization

可以把解析注解代码,放到之后的方法postProcessAfterInitialization里面,可对bean做一些修改。

 

package annosupport;

import java.lang.reflect.Field;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import anno.FiledAnnotation;
import anno.TypeAnnotation;
import service.Table;

public class AnnoSupport implements BeanPostProcessor{
	public static Table annoImpl() throws Exception{
		Class<Table> class1=Table.class;
		Table table=class1.newInstance();//返回对象新的实例
		if(class1.isAnnotationPresent(TypeAnnotation.class)){//判断类上面是否有注解
			TypeAnnotation typeAnnotation=(TypeAnnotation) class1.getAnnotation(TypeAnnotation.class);//得到类注解对象
			System.out.println("tableName:"+typeAnnotation.tableName()+"------>getEnumClassDemo:"+typeAnnotation.getEnumClassDemo());
			class1.getMethod("setId", String.class).invoke(table, typeAnnotation.tableName());//调用setter方法设置值,id值
		}
		
		Field[] fields= class1.getDeclaredFields();//得到所有属性
		for (Field field : fields) {
			if(field.isAnnotationPresent(FiledAnnotation.class)){//判断字段上面是否有注解
				FiledAnnotation filedAnnotation=field.getAnnotation(FiledAnnotation.class);//得到字段注解对象
				System.out.println("fileName:"+filedAnnotation.fileName()+"------>getEnumFiledDemo:"+filedAnnotation.getEnumFiledDemo());
				class1.getMethod("setName", String.class).invoke(table, filedAnnotation.fileName());//调用setter方法设置值,name值
			}
		}
		return table;
	}

	/**
	 * spring bean 实例化之前操作
	 */
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("bean实例化之前");
		return bean;
	}

	/**
	 * spring bean 实例化之后操作
	 */
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("bean实例化之后");
		try {
			bean=annoImpl();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bean;
	}
}

 配置spring的配置文件

配置包的扫描路径以及位置

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd    
                        http://www.springframework.org/schema/mvc    
                        http://www.springframework.org/schema/mvc/spring-mvc-3.2.1.xsd">               
        <bean id="table" class="service.Table"/><!--把被注解的类交给spring管理-->
	<bean class="annosupport.AnnoSupport"/><!--注解支持类交给spring管理-->
        
</beans>  

被注解的类

 

package service;

import org.springframework.stereotype.Service;
import anno.FiledAnnotation;
import anno.TypeAnnotation;
import anno.FiledAnnotation.EnumFiledDemo;
import anno.TypeAnnotation.EnumClassDemo;

@TypeAnnotation(tableName="类注解",getEnumClassDemo=EnumClassDemo.BULE)
public class Table {
	private String id;
	@FiledAnnotation(fileName="字段注解",getEnumFiledDemo=EnumFiledDemo.GREEN)
	private String name;
	private int age;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 测试例子:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.Table;

public class TestSpring {
	public static void main(String[] args) {
		try {
			ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
			Table table=(Table) ctx.getBean("table");
			System.out.println("id:"+table.getId()+"---->name:"+table.getName());
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

bean实例化之后
tableName:类注解------>getEnumClassDemo:BULE
fileName:字段注解------>getEnumFiledDemo:GREEN
id:类注解---->name:字段注解//说明注解成功起作用了,类注解的作用是把tableName值放入id属性中,并创建实例;字段注解是吧filedName值放入name属性当中,并注入实例。

 

AnnoSupport加上@Service注解交给spring

Table加上@Service注解交给spring

在spring配置文件进行配置:

<context:component-scan base-package="annosupport" />

 

<context:component-scan base-package="service" />

其余的bean配置可以去掉

直接测试也可以

 

分享到:
评论

相关推荐

    spring架构详解 spring架构详解

    Spring框架广泛运用了多种设计模式,如工厂模式(BeanFactory)、单例模式(Singleton)、代理模式(AOP代理)、装饰器模式(BeanPostProcessor)等,这些模式的运用使得Spring具有高度的灵活性和可扩展性。...

    Spring注解详解

    Spring注解详解 Spring框架中,注解(Annotation)是一种元数据,能够提供更多关于程序元素的信息,从而简化配置和编程。Spring从2.5版本开始支持注解,通过使用注解,可以使得Bean的配置更加简洁和灵活。 注册...

    详解使用Spring的BeanPostProcessor优雅的实现工厂模式

    【Spring的BeanPostProcessor与工厂模式】 在Spring框架中,BeanPostProcessor(BPP)是一个强大的接口,它允许我们自定义bean的初始化和销毁过程。BPP是在bean实例化之后,但初始化之前以及销毁之前执行特定操作的...

    spring注解

    Spring 注解详解 Spring 注解是 Spring 框架中的一种强大功能,它允许开发者使用注解来配置和管理 Bean 对象。本文将详细讲解 Spring 注解的含义、类型、使用方法和相关配置。 注册注解处理器 在 Spring 中,需要...

    Spring4如何自定义@Value功能详解

    这时,自定义注解和`BeanPostProcessor`的结合可以提供更大的灵活性,让你能够根据业务逻辑定制更复杂的注入规则。 总的来说,`@Value`在Spring 4中是一个强大且灵活的工具,用于注入配置值。通过理解它的基本用法...

    Spring注解驱动开发.pdf

    ### Spring注解驱动开发知识点详解 #### 一、Spring注解驱动概述 Spring框架通过引入注解支持,极大地简化了Java EE应用的开发工作。它不仅提供了基础的依赖注入功能,还增强了对组件扫描的支持,使得开发者能够...

    java学习之spring2.0

    【Spring 2.0 知识点详解】 Spring 2.0是Java企业级应用开发中的重要框架,它以其简洁的“实用主义”原则降低了J2EE开发的复杂性。以下将详细介绍Spring 2.0的核心技术和关键特性。 1. **Spring 概述** - **起源...

    spring4注解

    ### Spring4 注解详解 #### 一、背景与概述 在Spring框架的早期版本中,主要依赖XML配置文件来进行依赖注入和其他配置管理。随着技术的发展和应用需求的变化,这种配置方式逐渐显得繁琐且不易维护。为了解决这一...

    spring-custom-master.7z

    《Spring自定义实现详解》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,它以其强大的依赖注入、面向切面编程以及丰富的生态体系赢得了开发者们的喜爱。本项目"spring-custom-master"旨在深入...

    Spring Annotaion Support详细介绍及简单实例

    Spring通过一系列的扩展点和钩子(hook),允许开发者自定义容器行为,其中BeanPostProcessor接口就是一个非常重要的扩展点。 BeanPostProcessor接口提供了两个方法,分别是postProcessBeforeInitialization和...

    详解如何在低版本的Spring中快速实现类似自动配置的功能

    综上所述,要在低版本的Spring中实现类似自动配置的功能,需要巧妙地利用Spring提供的扩展点,如BeanFactoryPostProcessor和BeanPostProcessor,以及Java Config和XML配置的组合。同时,还需要结合生命周期回调和...

    Spring的BeanFactory的接口注解

    ### Spring的BeanFactory的接口注解 #### 一、引言 在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心...

    高级Java人才培训专家-spring高级49讲

    - **@Aspect与Advisor**:解释Spring AOP中的@Aspect注解和Advisor的作用。 - **静态通知**:分析静态通知的实现机制。 - **动态通知**:探讨动态通知的实现原理。 #### 3. MVC框架 - **MVC处理流程**:详细介绍...

    spring-beans

    此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建和初始化过程。 在Spring框架中,"spring-beans"模块是所有其他模块的基石,它提供的IoC...

    Spring3注解介绍.docx

    Spring3 是一个强大的Java应用程序框架,它引入了注解来简化配置,提高代码的可读性和可维护性。本文将详细介绍Spring3中的主要注解及其用法。 首先,要让Spring容器识别并处理注解,我们需要注册注解处理器。有三...

Global site tag (gtag.js) - Google Analytics