自定义Spring标签大概分为如下几步:
@Data
public class UserDTO {
private String userName;
private String email;
}
public class UserExecutor {
private String userName;
private String email;
public UserExecutor(){
}
public UserExecutor(UserDTO userDTO) {
this.userName = userDTO.getUserName();
this.email = userDTO.getEmail();
}
public void init() {
System.out.println("print user info :" + userName + "___" + email);
}
public void des() {
System.out.println("UserExecutor: destroy");
}
}
UserDTO 的 parser
public class UserBeanDefineParser extends AbstractSimpleBeanDefinitionParser {
static final String USERDTO_CLASS = UserDTO.class.getName();
@Override
protected Class> getBeanClass(Element element) {
return UserDTO.class;
}
@Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
String userName = element.getAttribute("userName");
String email = element.getAttribute("email");
if (StringUtils.hasText(userName)) {
builder.addPropertyValue("userName", userName);
}
if (StringUtils.hasText(email)) {
builder.addPropertyValue("email", email);
}
super.doParse(element, parserContext, builder);
}
/**
* 如果标签没有定义id,则用tag.executor作为id
* @return
*/
public String getResolveId() {
return "tag.userDto";
}
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
String id = element.getAttribute("id");
return StringUtils.hasText(id) ? super.resolveId(element, definition, parserContext) : getResolveId();
}
}
UserExecutor 的 BeanDefinitionParser
public class ExecutorBeanDefineParser extends AbstractSimpleBeanDefinitionParser {
@Override
protected Class> getBeanClass(Element element) {
return UserExecutor.class;
}
@Override
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
BeanDefinitionRegistry registry = parserContext.getRegistry();
String[] beanNames = registry.getBeanDefinitionNames();
String className = "tag.executor";
for (int i = 0; i < beanNames.length; i++) {
String beanName = beanNames[i];
String clazz = registry.getBeanDefinition(beanNames[i]).getBeanClassName();
if(UserBeanDefineParser.USERDTO_CLASS.equalsIgnoreCase(clazz)){
className = beanName;
break;
}
}
/**
* 这里将UserDTO作为构造方法的参数,如果不需要,可以不用设置
*/
builder.addConstructorArgReference(className);
builder.setInitMethodName("init");
builder.setDestroyMethodName("des");
builder.setRole(2);
}
/**
* 如果标签没有定义id,则用tag.executor作为id
* @return
*/
public String getResolveId() {
return "tag.executor";
}
@Override
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
String id = element.getAttribute("id");
return StringUtils.hasText(id) ? super.resolveId(element, definition, parserContext) : getResolveId();
}
}
public class UserHandlerSupport extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefineParser());
registerBeanDefinitionParser("executor", new ExecutorBeanDefineParser());
}
}
spring.schemals文件内容
http\://www.example.org/schema/user.xsd=META-INF/user.xsd
spring.handlers文件内容
http\://www.example.org/schema/user=com.nhl.tag.handler.UserHandlerSupport
创建完成的目录结构
在resources下面创建test.xml文件进行测试。test.xml文件内容:
test测试代码如下:
public class TagTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:test.xml");
UserDTO userDTO = applicationContext.getBean(UserDTO.class);
// 下面打印成功,说明Bean UserDTO 注册成功,且数据初始化成功
System.out.println(JSONObject.toJSONString(userDTO));
UserExecutor userExecutor = applicationContext.getBean(UserExecutor.class);
// 下面打印成功,说明Bean UserExecutor 注册成功,且数据初始化成功
System.out.println(JSONObject.toJSONString(userExecutor));
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
String[] beanDefintionNames = beanFactory.getBeanDefinitionNames();
String beanId = "";
for(String beanDefintionName : beanDefintionNames){
Class clazz = applicationContext.getBean(beanDefintionName).getClass();
if(clazz == UserDTO.class){
beanId = beanDefintionName;
break;
}
}
// 执行完下单打印 UserExecutor: destroy
beanFactory.removeBeanDefinition(beanId);
}
}
执行结果: