`
中国爪哇程序员
  • 浏览: 167503 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring注解浅析

 
阅读更多
参考资料:
http://blog.csdn.net/longeremmy/article/details/8289924

在项目配置中,用注解代替配置,已经很普遍了。
在spring中,有看到Component,Repository,Service,Controller
在研究这四个注解之前,需要先了解ClassPathBeanDefinitionScanner
我们在application.xml配置的<context:component-scan base-package="a.b.c" />
后台处理的bean就是这个类。以下是源代码的描述。
其中这个类的属性BeanDefinitionDefaults beanDefinitionDefaults,管理了spring容器处理这些bean的方式。如是否支持延时加载,自动匹配规则,初始化方法,销毁方法等。

/**
 * A bean definition scanner that detects bean candidates on the classpath,
 * registering corresponding bean definitions with a given registry (BeanFactory
 * or ApplicationContext).
 *
 * <p>Candidate classes are detected through configurable type filters. The
 * default filters include classes that are annotated with Spring's
 * {@link org.springframework.stereotype.Component @Component},
 * {@link org.springframework.stereotype.Repository @Repository},
 * {@link org.springframework.stereotype.Service @Service}, or
 * {@link org.springframework.stereotype.Controller @Controller} stereotype.
 *
 * @author Mark Fisher
 * @author Juergen Hoeller
 * @since 2.5
 * @see org.springframework.stereotype.Component
 * @see org.springframework.stereotype.Repository
 * @see org.springframework.stereotype.Service
 * @see org.springframework.stereotype.Controller
 */


package car;

public interface Car {

    public String getCarName();
}



package car;

import org.springframework.stereotype.Service;

//@Service
public class Audi implements Car{

    @Override
    public String getCarName() {
        return "AUDI";
    }

}



package car;

import org.springframework.stereotype.Service;

@Service
public class Bmw implements Car{

    @Override
    public String getCarName() {
        return "BMW";
    }

}



package car;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class User {

    @Autowired
    //@Qualifier("audi")
    private Car carssssss;

    public String getCar() {
        return carssssss.getCarName();
    }
}


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


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

public class Test {

    public static void main(String[] args) {
        System.out.println("");
        ApplicationContext context = new ClassPathXmlApplicationContext("car/test.xml");
        String[] names = context.getBeanDefinitionNames();
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }

    }
}



上面的测试类main方法,并没有报错,至少可以看出两点:
(1)通过Service注解,注册到spring容器的名字是类名首字小写。
(2)用Autowired注解,因为User类,属性名是瞎写的,但依然可以注入成功,说明 默认是根据类型进行注入的。
(3)把Audi类中的注解打开,就会抛异常,是因为spring容器有两个相同的类型,spring容器不知道应该注入哪个类。出现这种场合,需要@Qualifier("audi")来指定用哪个类来进行注入。这时autowired注入方式,由byType转成byName.
(4)@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

打印结果:
bmw
user
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor



从上图,用Component,Repository,Service,Controller四个注解,都可以把类注册到spring容器里,但这四个有什么区别呢。使用上没什么特别的,都可以把类注册到spring中。但是四个注解暗示类代表着不同的含义.
1、@Service用于标注业务层组件
2、@Controller用于标注控制层组件(如struts中的action)
3、@Repository用于标注数据访问组件,即DAO组件.
4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。   
具体信息可以参考源代码关于注解的描述。


  • 大小: 5.1 KB
分享到:
评论

相关推荐

    Spring 注解学习手札(四) 持久层浅析

    在本篇《Spring注解学习手札(四)持久层浅析》中,我们将深入探讨Spring框架在持久层的应用,特别是如何通过注解简化数据库操作。Spring作为一个强大的轻量级框架,提供了丰富的功能来处理数据访问,使得开发者可以...

    spring 监听器浅析.docx

    本文将对Spring监听器进行深入浅析,包括其工作原理、源码解析以及如何使用。 首先,Spring监听器是基于事件驱动模型的,这种模式在多线程和分布式系统中非常常见。在Spring中,当一个特定的事件发生时,如bean的...

    Spring 最新动态:浅析 Spring 3.1、3.2 和 3.3

    另一个亮点是`AspectJ注解驱动的AOP(面向切面编程)`的加强,使得切面的定义更加直观和易于维护。 Spring 3.2则进一步增强了对Java EE 6的支持,包括对JSR-330依赖注入标准的全面兼容,以及对CDI(Contexts and ...

    浅析SpringCache缓存1

    6. **JSR-107 支持**:从 Spring 4.1 开始,Spring Cache 添加了对 JSR-107(Java Caching API)标准的注解支持,使得开发者可以直接使用 JSR-107 提供的缓存注解,如 `@CacheResult`、`@CacheEvictAll` 等,增强了...

    Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析 Spring Boot 提供了自动配置的机制,通过大量的条件注解来实现自动化配置。条件注解是指在特定条件下创建特定的Bean,例如,在某些系统变量下创建Bean,或者只有在某个Bean创建...

    深入浅析Spring AOP的实现原理1

    在Spring中,通过注解或XML配置可以定义切面和通知。例如,使用`@Aspect`注解创建切面类,`@Before`、`@After`、`@Around`等注解定义通知,`@Pointcut`定义切入点表达式。 ```java @Aspect public class ...

    浅析@ReponseBody和@RequestBody注解

    浅析@ReponseBody和@RequestBody注解 @ReponseBody和@RequestBody是Spring MVC框架中两个重要的注解,分别用于处理HTTP请求和响应体。下面我们将详细分析这两个注解的作用和Spring MVC内部是如何对他们进行解析的。...

    Spring Cloud Netflix架构浅析(小结)

    Spring Cloud Netflix是一个强大的微服务工具集,它是Spring Cloud生态的一部分,专门为基于Spring Boot的应用提供了一套完整的服务治理方案。在微服务架构中,Spring Cloud Netflix提供了多种组件来解决分布式系统...

    深入浅析Spring 的aop实现原理

    同时,Spring还提供了基于注解的AOP,简化了切面的定义,使得开发人员可以更加方便地实现横切关注点的管理。 在实际开发中,我们可以使用Spring AOP来实现如事务管理、日志记录等功能,避免在业务代码中插入这些与...

    浅析mybatis和spring整合的实现过程

    - `typeAliases`:可以显式指定类型别名,当类上没有`@Alias`注解时,Mybatis会使用类的简单名称作为别名。 例如,要显式指定类型别名,可以这样配置: ```xml &lt;value&gt;...

    sping AOP 权限管理方案浅析

    本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...

    深入浅析Spring 中的Null-Safety

    自从Spring 5引入这一特性以来,开发者可以通过使用特定的注解来声明API和字段的可空性,从而在编译阶段就能发现潜在的NPE问题。 首先,我们来看看Spring提供的四个关键注解: 1. **@Nullable**:这个注解表明某个...

    浅析Java的Spring框架中IOC容器容器的应用

    例如,可以使用`@Component`注解标记一个类作为Spring Bean,然后使用`@Autowired`注解自动注入依赖。 总的来说,Spring的IoC容器是其核心特性之一,它通过BeanFactory和ApplicationContext提供了一种灵活的方式来...

    浅析SpringBoot自动化配置原理实现

    Spring Boot 的自动配置类通常会使用 `@Conditional` 注解,比如 `@ConditionalOnClass` 和 `@ConditionalOnBean`,这些注解用于判断类路径中是否存在某个类或某个 Bean,如果满足条件,则自动配置相应的 Bean。...

    浅析Digester

    【标题】:浅析Digester 在Java开发中,我们经常需要处理XML文件,解析XML并将其内容映射到相应的Java对象上。这时,Apache Commons Digester库就派上了用场。本文将深入探讨Digester的功能、工作原理以及如何在...

    Java中文乱码浅析及解决方案

    对于HTTP控制器,可以使用`@RequestMapping`注解指定响应编码: ```java @RequestMapping(value="/xxx", produces = "application/json; charset=utf-8") ``` 最后,数据库操作中的乱码问题也不容忽视。如果数据库...

    浅析SpringBoot中使用thymeleaf找不到.HTML文件的原因

    在使用Thymeleaf时,需要将Controller类放置在与@SpringBootApplication注解的启动类相同包或者子包下,否则Spring Boot无法找到Controller类。 四、确认Controller类不能使用@RestController或@ResponseBody注解 ...

Global site tag (gtag.js) - Google Analytics