网站首页 > 技术教程 正文
思考:基于注解的容器配置方式比传统xml方式更好么?
答:其实每一种方式都有利有弊,开发者选择他们喜欢的合适的方式就可以了。注解方式特点简单明了,但bean配置分散,难以总体控制;而xml方式使业务组件与源码分离,更有利于总体控制所配置的bean元数据。实际项目中往往根据需要都是上面两种方式结合使用。
思考:注解工作原理是如何进行的呢?
答:Spring实现自动装配,继承了org.springframework.web.context.support.SpringBeanAutowiringSupport类,该类定义了无参构造函数:
public SpringBeanAutowiringSupport() { processInjectionBasedOnCurrentContext(this); }
而Java实例构造时会调用默认父类无参构造方法,Spring正是利用了这一点,让"操作元素的代码"得以自动执行,最终注入还是利用了Java反射机制来实现bean自动注入的,如下图:
下面介绍几个常用的类内部注解。
- @Required
用于bean中setter方法,保证下面movieFinder不为空,如下:
public class SimpleMovieLister { private MovieFinder movieFinder; @Required //set方法 public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
该注解表明在bean配置时间内,配置的属性值必须注入,否则抛出BeanInitializationException异常,我们可以通过xml文件的bean中明确指定属性,或者通过自动注入注解方式来保证属性值不为空。
- @Autowired
可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,如下
public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired //成员变量 private MovieCatalog movieCatalog; @Autowired //构造函数 public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } @Autowired //普通方法 public void prepare(MovieCatalog movieCatalog) { this.movieCatalog = movieCatalog; } }
注意事项:
在使用@Autowired时,首先查询对应类型的bean,如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据,如果查询的结果不止一个,那么@Autowired会根据名称来查找,如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false,如下
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required = false) //保证为空,不抛异常 public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } . }
Spring 5.0以后,可以用@Nullable来解决异常问题,如下:
public class SimpleMovieLister { @Autowired public void setMovieFinder(@Nullable MovieFinder movieFinder) { ... } }
- @Primary
IOC根据类型注解可能会有多个对应的bean,如下:
public class MovieRecommender { @Autowired private MovieCatalog movieCatalog; // ... }
可通过@Primary则指定满足条件具有优先权的bean。如下:
@Configuration public class MovieConfiguration { @Bean @Primary //具有优先权 public MovieCatalog firstMovieCatalog() { ... } @Bean public MovieCatalog secondMovieCatalog() { ... } // ... }
则MovieRecommender用firstMovieCatalo来注入。
- @Qualifier
当类型注解可能会有多个对应的bean,如何选择正确的bean的方法,比@Primary更灵活,可以通过@Qualifier指定值来选择哪个是你需要的bean。如下:
@Configuration public class MovieConfiguration { @Bean("first") public MovieCatalog firstMovieCatalog() { ... } @Bean("sec") //根据名称指定 public MovieCatalog secondMovieCatalog() { ... } // ... }
加上@Qualifier(“sec”)就知道IOC控制器就知道要注入哪个bean
public class MovieRecommender { @Autowired @Qualifier("sec") private MovieCatalog movieCatalog; // ... }
- @Resource
是Java注入JSR-250提供的注解方式,spring 也提供了支持。Spring通过其带有的name属性来实现注入。如下
public class SimpleMovieLister { private MovieFinder movieFinder; @Resource(name="myMovieFinder") public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
如果@Resource不带name,则默认值是bean属性名称。
猜你喜欢
- 2024-10-19 Java 项目编译提示 javax.xml.bind.annotation does not exist 错误
- 2024-10-19 Android annotation包下常用的注解
- 2024-10-19 SpringMVC疑难一:mvc:annotation-dr
- 2024-10-19 Spring 中 AnnotationConfigUtils
- 2024-10-19 spring mvc 配置失效了?(springmvc的配置)
- 2024-10-19 为什么都爱着江南?黛瓦白墙,烟雨朦胧,是文人魂牵梦绕的故乡
- 2024-10-19 Spring框架系列之构造方法底层剖析01
- 2024-10-19 基于.NET6包含DDD,ES,CQRS等概念的开源
- 2024-10-19 spring 中 AnnotationUtils 的常用方法
- 2024-10-19 SpringBoot实战4-Spring基础-IoC容器
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)