参考资料:
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监听器是基于事件驱动模型的,这种模式在多线程和分布式系统中非常常见。在Spring中,当一个特定的事件发生时,如bean的...
另一个亮点是`AspectJ注解驱动的AOP(面向切面编程)`的加强,使得切面的定义更加直观和易于维护。 Spring 3.2则进一步增强了对Java EE 6的支持,包括对JSR-330依赖注入标准的全面兼容,以及对CDI(Contexts and ...
6. **JSR-107 支持**:从 Spring 4.1 开始,Spring Cache 添加了对 JSR-107(Java Caching API)标准的注解支持,使得开发者可以直接使用 JSR-107 提供的缓存注解,如 `@CacheResult`、`@CacheEvictAll` 等,增强了...
Spring Boot 自动配置之条件注解浅析 Spring Boot 提供了自动配置的机制,通过大量的条件注解来实现自动化配置。条件注解是指在特定条件下创建特定的Bean,例如,在某些系统变量下创建Bean,或者只有在某个Bean创建...
在Spring中,通过注解或XML配置可以定义切面和通知。例如,使用`@Aspect`注解创建切面类,`@Before`、`@After`、`@Around`等注解定义通知,`@Pointcut`定义切入点表达式。 ```java @Aspect public class ...
浅析@ReponseBody和@RequestBody注解 @ReponseBody和@RequestBody是Spring MVC框架中两个重要的注解,分别用于处理HTTP请求和响应体。下面我们将详细分析这两个注解的作用和Spring MVC内部是如何对他们进行解析的。...
Spring Cloud Netflix是一个强大的微服务工具集,它是Spring Cloud生态的一部分,专门为基于Spring Boot的应用提供了一套完整的服务治理方案。在微服务架构中,Spring Cloud Netflix提供了多种组件来解决分布式系统...
同时,Spring还提供了基于注解的AOP,简化了切面的定义,使得开发人员可以更加方便地实现横切关注点的管理。 在实际开发中,我们可以使用Spring AOP来实现如事务管理、日志记录等功能,避免在业务代码中插入这些与...
- `typeAliases`:可以显式指定类型别名,当类上没有`@Alias`注解时,Mybatis会使用类的简单名称作为别名。 例如,要显式指定类型别名,可以这样配置: ```xml <value>...
本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...
自从Spring 5引入这一特性以来,开发者可以通过使用特定的注解来声明API和字段的可空性,从而在编译阶段就能发现潜在的NPE问题。 首先,我们来看看Spring提供的四个关键注解: 1. **@Nullable**:这个注解表明某个...
例如,可以使用`@Component`注解标记一个类作为Spring Bean,然后使用`@Autowired`注解自动注入依赖。 总的来说,Spring的IoC容器是其核心特性之一,它通过BeanFactory和ApplicationContext提供了一种灵活的方式来...
Spring Boot 的自动配置类通常会使用 `@Conditional` 注解,比如 `@ConditionalOnClass` 和 `@ConditionalOnBean`,这些注解用于判断类路径中是否存在某个类或某个 Bean,如果满足条件,则自动配置相应的 Bean。...
【标题】:浅析Digester 在Java开发中,我们经常需要处理XML文件,解析XML并将其内容映射到相应的Java对象上。这时,Apache Commons Digester库就派上了用场。本文将深入探讨Digester的功能、工作原理以及如何在...
对于HTTP控制器,可以使用`@RequestMapping`注解指定响应编码: ```java @RequestMapping(value="/xxx", produces = "application/json; charset=utf-8") ``` 最后,数据库操作中的乱码问题也不容忽视。如果数据库...
在使用Thymeleaf时,需要将Controller类放置在与@SpringBootApplication注解的启动类相同包或者子包下,否则Spring Boot无法找到Controller类。 四、确认Controller类不能使用@RestController或@ResponseBody注解 ...