自定义注解的spring注入问题
自定义注解的spring注入问题
帅的不像男的 发表于8个月前
自定义注解的spring注入问题
  • 发表于 8个月前
  • 阅读 55
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: SpringMvc的注入式通过id去查找上下文,这种方式用起来非常好用,但是在使用自定义标签ਲ...

   我就我遇到的自定义注解无法注入的问题整理一下:

1、遇到的问题

    SpringMvc的注入式通过id去查找上下文,这种方式用起来非常好用,但是在使用自定义标签时遇到了问题,注入永远为空。这是为什么呢?

    这是因为spring 注解注入@Autowired 前提是这个类被实例化,你自定义的标签只有在调用的时候 才会实例化的。

2、解决办法

 1、 如果使用 Spring 的 MVC 包,则可以使用 RequestContextAwareTag 类。例:

public class AuthTag extends RequestContextAwareTag {
 
    private IAuthService authService;
 
    private String auth;
 
    public String getAuth() {
        return auth;
    }
 
    public void setAuth(String auth) {
        this.auth = auth;
    }
 
    @Override
    protected int doStartTagInternal() throws Exception {
        boolean result = false;
 
        String erp = LoginContext.getLoginContext().getPin();
        authService = (IAuthService) this.getRequestContext().getWebApplicationContext().getBean("authService");
        List<SysAuth> list = authService.getByErp(erp);
        for(SysAuth a:list){
            if(auth.equals(a.getToken())){
                result = true;
            }
        }
 
        return result? EVAL_BODY_INCLUDE : SKIP_BODY;
    }
} 

2、没有使用Spring的Mvc包则建议使用以下方法:
 

/* 获取Spring上下文(以下代码可利用工具类进行包装) */
PageContext pageContext = (PageContext) this.getJspContext();
ServletContext servletContext = pageContext.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

/* 从上下文中获取指定的Bean */
IAuthService authService = (IAuthService) wac.getBean("authService");
/**
* 在Spring上下文中根据对象ID获取对象引用
*
* @param jspContext JSP上下文
* @param beanId 对象ID
* @return 对象引用
*/
@SuppressWarnings({"unchecked"})
public <T> T getBean(JspContext jspContext, String beanId)
{
T bean = null;
PageContext pageContext = (PageContext) jspContext;
if (pageContext != null)
{
ServletContext servletContext = pageContext.getServletContext();
if (servletContext != null)
{
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
if (wac != null && wac.containsBean(beanId))
{
bean = (T) wac.getBean(beanId);
}
}
}
return bean;
}

3、结果

   我使用了第一种方式,注入的问题完美解决,注意继承类不同时需要实现的方法也不一样。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 9
博文 79
码字总数 45547
×
帅的不像男的
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: