对Spring <context:annotation-config/>的理解

在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是向 Spring 容器注册

AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor  4 BeanPostProcessor

注册这4 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

例如:

如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean

传统声明方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource @ PostConstruct@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessorBean

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessorBean

同样,传统的声明方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。

  不过,我们使用注解一般都会配置扫描包路径选项

  <context:component-scan base-package=”XX.XX”/> 

  (用来扫描哪些包有注释,并开启注入)

    该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。

注意:

  当Spring注入中还包涵其他Spring注入,则<context:annotation-config/>不能省略,<context:annotation-config/>还起到连线的作用,会优先把包涵在最里面的注入优先注入。

  因为Spring注入是没有先后顺序的,当最外层的Spring注入完成,而被包涵的注入没有注入,则会报java.lang.NullPointerException

  

这是一个Conrtoller

 

@Controller
@RequestMapping("/front/user/view.shtml")
public class ContrlUser {
    @Autowired
    private IServiceUser serviceUser;
    
    @RequestMapping(params = "act=view")
    public void view(int id, HttpServletRequest request, HttpServletResponse response) throws IOException{
        User user = serviceUser.getUser(id);
        response.getWriter().write(user.getName());
    }
}

 这是Serviece

public class ServiceUserImpl implements IServiceUser{
    @Autowired
    private UserDao userDao;
    
    public User getUser(int id) {
        System.out.println("ServiceUserImpl"+id);
        User user = userDao.getUser(id);
        return user;
    }

    public List<User> listUser() {
        return null;
    }

    public void editUser(User user) {
        
    }

    public void deleteUser(int id) {
        
    }

}

Controller中有Spring注入,需注入Serviece 而Service中有Dao的Spring注入

当省略<context:annotation-config/>后 由于Controller中要注入serviceUser,当serviceUser优先注入后,而Dao还没有注入,此时就会报java.lang.NullPointerException

 

原文地址:https://www.cnblogs.com/onlymate/p/4347778.html