在项目配置中,用注解代替配置,已经很普遍了。

在spring中,有看到Component,Repository,Service,Controller

在研究这四个注解之前,需要先了解ClassPathBeanDefinitionScanner

我们在application.xml配置的

后台处理的bean就是这个类。以下是源代码的描述。

其中这个类的属性BeanDefinitionDefaults beanDefinitionDefaults,管理了spring容器处理这些bean的方式。如是否支持延时加载,自动匹配规则,初始化方法,销毁方法等。

Java代码

/**

* A bean definition scanner that detects bean candidates on the classpath,

* registering corresponding bean definitions with a given registry (BeanFactory

* or ApplicationContext).

*

*

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

*/

Java代码

package car;

public interface Car {

public String getCarName();

}

Java代码

package car;

import org.springframework.stereotype.Service;

//@Service

public class Audi implements Car{

@Override

public String getCarName() {

return "AUDI";

}

}

Java代码

package car;

import org.springframework.stereotype.Service;

@Service

public class Bmw implements Car{

@Override

public String getCarName() {

return "BMW";

}

}

Java代码

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();

}

}

Java代码

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泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

具体信息可以参考源代码关于注解的描述。

java中spring的注解_Java代码中spring注解浅析相关推荐

  1. java ip加密如何访问_java代码中如何实现http访问

    作者:释怀Na 出自:CSDN 原文:blog.csdn.net/qq_35906921/article/details/98076258 java代码中如何实现http访问 大概的实现就是 请求ht ...

  2. java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大。

    java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大. A:正确 B:错误 蒙蔽树上蒙蔽果,蒙蔽树下你和我 拿到这道题,我觉得说的贼有道理,注释太多,尺寸变大.无疑与就和驾考 一样, ...

  3. APPium连接真机输入框中输入的内容与代码中不一致

    今天解决了上一个问题,又碰到了一个新的问题. 问题:连接真机输入框中输入的内容与代码中不一致. 描述: 想实现登录页面输入用户名和密码自动登录,可是在输入用户名和密码的框中输入的内容总是与代码中的不一 ...

  4. java反射 注解_Java反射中的注解

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  5. java异常统一处理_Java 代码中的全局异常处理

    最近接手一个新项目,写用例的时候去翻看代码,发现部分代码里缺少基本的异常处理,包括对参数异常以及业务异常的处理.对照之前负责过的异常处理做得比较好的项目,给开发提了几点建议,顺便又去翻看了之前项目的代 ...

  6. java定时调度main方法_java相关:Spring中实现定时调度的几种方法

    java相关:Spring中实现定时调度的几种方法 发布于 2020-11-28| 复制链接 本篇文章主要介绍了Spring中实现定时调度示例,可以在无人值守的时候系统可以在某一时刻执行某些特定的功能 ...

  7. java 不要使用魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

  8. java输出日志_java代码中如何正确使用loggger日志输出

    java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...

  9. java 魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

  10. java 绑定微信号开发_Java开发中的更多常见危险信号

    java 绑定微信号开发 在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似 ...

最新文章

  1. 岗位推荐 | 微软AI Research Group招聘自然语言处理AI算法研究实习生
  2. find vba 模糊_VBA积木代码方案:实现多重查找、模糊查找、清除值
  3. ssas脚本组织程序_脚本调试编辑
  4. shell脚本执行命令错误处理
  5. Qt——P7 对象树
  6. Powershell与运维之服务器管理(一) 利用Powershell管理HP服务器
  7. 小刘的BUG(sql注入)
  8. aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  9. 2022年房地产市场趋势展望
  10. c#模拟看板控件_C#TIPTOP电子看板
  11. 中关村连夜征集138项黑科技加入肺炎阻击战
  12. 阿拉伯数字转换成大写的数字
  13. 电脑上的文件经常丢失,怎么办?
  14. 网站识别Windows AD 域账号,并自动登录
  15. 处理器架构——多发射处理器技术
  16. 中国研究的超级系统计算机,打造超级系统U盘
  17. python在线编译器简单实现
  18. 用一个比喻来解释对 同步 异步 阻塞 非阻塞 轮询 回调 的理解
  19. ElasticSearch中Cat接口详解
  20. Beef-xss安装及使用

热门文章

  1. 七个不放过和四项原则
  2. java面向接口编程详解
  3. Spring框架入门程序:获取Bean的三种方式
  4. MyCat分片规则之按自然月分片
  5. 维度模型数据仓库基础对象概念一览
  6. WebApp的自动测试工具: Jenkins
  7. 【用jersey构建REST服务】系列文章
  8. scikit-learn:在实际项目中用到过的知识点(总结)
  9. 设计模式之十三:适配器模式(Adapter)
  10. 使用PHP输出中文JSON字符串