- 浏览: 405942 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (158)
- SpringBoot (10)
- vue.js (4)
- 2017基础知识 (2)
- jquery (4)
- extjs (8)
- spring (13)
- Java基础 (24)
- ibatis (2)
- oracle (18)
- 服务器配置 (8)
- maven (7)
- web应用开发 (14)
- 数据库 (9)
- 第三方依赖 (3)
- 百味人生 (7)
- svn (1)
- 问题一堆 (2)
- 测试驱动开发 (1)
- webServices (2)
- 网络编程 (2)
- 其它 (4)
- hibernate (2)
- ec标签序号列 (1)
- javascript (1)
- ActiveMQ (2)
- linux (5)
- UI (1)
- 问题汇集 (1)
- redis (1)
最新评论
-
jackson200:
讲解的狠不错!谢谢!
spring注入原理 -
阳光泛滥的日子:
讲的很透彻,受教了 。
spring中注解的实现原理 -
liudechao9:
最近在研究这方面,很不错,但是多线程并发的时候可能会出问题,而 ...
spring中注解的实现原理 -
小帅1127:
厉害啊 我的哥
spring中注解的实现原理 -
phoenixpaul:
...
Oracle存储过程和程序包
@Autowired和@Resource的区别:
在Java中使用@Autowired和@Resource注解进行装配,这两个注解分别是:
1、@Autowired按照默认类型(类名称)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许为null,可以设置它的required属性为false
如果我们按名称装配,可以结合@Qualifie注解一起使用。
如:
@Autowired @qualifie("personDaoBean")
private PersonDaoBean personDaoBean;
@Resource默认按照名称(name="test")进行装配,名称可以通过@resource的name属性设定,当找不到与名称匹配的bean才会按类型装配
注意:如果没有指定name属性,并且安装默认的名称依然找不到依赖对象时,@Resource会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
下面的示例来简单的讲述spring注解原理:
本例实现了在set方法上和在字段属性上注解的处理解析。
1、定义注解
package com.yt.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Description:定义注解 * @ClassName: ZxfResource * @Project: spring-aop * @Author: zxf * @Date: 2011-6-7 */ // 在运行时执行 @Retention(RetentionPolicy.RUNTIME) // 注解适用地方(字段和方法) @Target({ ElementType.FIELD, ElementType.METHOD }) public @interface ZxfResource { //注解的name属性 public String name() default ""; }
2、带有注解的服务类
package com.yt.annotation; /** * @Description: 带有注解的服务 * @ClassName: UserDaoImpl * @Project: spring-aop * @Author: zxf * @Date: 2011-6-7 */ public class UserServiceImpl { public UserDaoImpl userDao; public User1DaoImpl user1Dao; // 字段上的注解,可以配置name属性 @ZxfResource public User2DaoImpl user2Dao; // set方法上的注解,带有name属性 @ZxfResource(name = "userDao") public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; } // set方法上的注解,没有配置name属性 @ZxfResource public void setUser1Dao(User1DaoImpl user1Dao) { this.user1Dao = user1Dao; } public void show() { userDao.show(); user1Dao.show1(); user2Dao.show2(); System.out.println("这里是Service方法........"); } }
3、要注入的DAO
package com.yt.annotation; /** * @Description: 要注入的DAo类 * @ClassName: UserDaoImpl * @Project: spring-aop * @Author: zxf * @Date: 2011-6-7 */ public class UserDaoImpl { String name ; public void show(){ System.out.println("这里是dao方法........"); } }
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id = "userDao" class="com.yt.annotation.UserDaoImpl" /> <bean id = "user1Dao" class="com.yt.annotation.User1DaoImpl" /> <bean id = "user2Dao" class="com.yt.annotation.User2DaoImpl" /> <bean id = "userService" class = "com.yt.annotation.UserServiceImpl" /> </beans>
4、注解处理器
package com.yt.annotation; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * @Description: spring中的注解原理 * @ClassName: ClassPathXMLApplicationContext * @Project: spring-aop * @Author: zxf * @Date: 2011-6-3 */ public class ClassPathXMLApplicationContext { Logger log = Logger.getLogger(ClassPathXMLApplicationContext.class); List<BeanDefine> beanList = new ArrayList<BeanDefine>(); Map<String, Object> sigletions = new HashMap<String, Object>(); public ClassPathXMLApplicationContext(String fileName) { //读取配置文件中管理的bean this.readXML(fileName); //实例化bean this.instancesBean(); //注解处理器 this.annotationInject(); } /** * 读取Bean配置文件 * @param fileName * @return */ @SuppressWarnings("unchecked") public void readXML(String fileName) { Document document = null; SAXReader saxReader = new SAXReader(); try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); document = saxReader.read(classLoader.getResourceAsStream(fileName)); Element beans = document.getRootElement(); for (Iterator<Element> beansList = beans.elementIterator(); beansList.hasNext();) { Element element = beansList.next(); BeanDefine bean = new BeanDefine( element.attributeValue("id"), element.attributeValue("class")); beanList.add(bean); } } catch (DocumentException e) { log.info("读取配置文件出错...."); } } /** * 实例化Bean */ public void instancesBean() { for (BeanDefine bean : beanList) { try { sigletions.put(bean.getId(), Class.forName(bean.getClassName()).newInstance()); } catch (Exception e) { log.info("实例化Bean出错..."); } } } /** * 注解处理器 * 如果注解ZxfResource配置了name属性,则根据name所指定的名称获取要注入的实例引用, * 如果注解ZxfResource;没有配置name属性,则根据属性所属类型来扫描配置文件获取要 * 注入的实例引用 * */ public void annotationInject(){ for(String beanName:sigletions.keySet()){ Object bean = sigletions.get(beanName); if(bean!=null){ this.propertyAnnotation(bean); this.fieldAnnotation(bean); } } } /** * 处理在set方法加入的注解 * @param bean 处理的bean */ public void propertyAnnotation(Object bean){ try { //获取其属性的描述 PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); for(PropertyDescriptor proderdesc : ps){ //获取所有set方法 Method setter = proderdesc.getWriteMethod(); //判断set方法是否定义了注解 if(setter!=null && setter.isAnnotationPresent(ZxfResource.class)){ //获取当前注解,并判断name属性是否为空 ZxfResource resource = setter.getAnnotation(ZxfResource.class); String name =""; Object value = null; if(resource.name()!=null&&!"".equals(resource.name())){ //获取注解的name属性的内容 name = resource.name(); value = sigletions.get(name); }else{ //如果当前注解没有指定name属性,则根据类型进行匹配 for(String key : sigletions.keySet()){ //判断当前属性所属的类型是否在配置文件中存在 if(proderdesc.getPropertyType().isAssignableFrom(sigletions.get(key).getClass())){ //获取类型匹配的实例对象 value = sigletions.get(key); break; } } } //允许访问private方法 setter.setAccessible(true); //把引用对象注入属性 setter.invoke(bean, value); } } } catch (Exception e) { log.info("set方法注解解析异常.........."); } } /** * 处理在字段上的注解 * @param bean 处理的bean */ public void fieldAnnotation(Object bean){ try { //获取其全部的字段描述 Field[] fields = bean.getClass().getFields(); for(Field f : fields){ if(f!=null && f.isAnnotationPresent(ZxfResource.class)){ ZxfResource resource = f.getAnnotation(ZxfResource.class); String name =""; Object value = null; if(resource.name()!=null&&!"".equals(resource.name())){ name = resource.name(); value = sigletions.get(name); }else{ for(String key : sigletions.keySet()){ //判断当前属性所属的类型是否在配置文件中存在 if(f.getType().isAssignableFrom(sigletions.get(key).getClass())){ //获取类型匹配的实例对象 value = sigletions.get(key); break; } } } //允许访问private字段 f.setAccessible(true); //把引用对象注入属性 f.set(bean, value); } } } catch (Exception e) { log.info("字段注解解析异常.........."); } } /** * 获取Map中的对应的bean实例 * @param beanId * @return */ public Object getBean(String beanId) { return sigletions.get(beanId); } public static void main(String[] args) { ClassPathXMLApplicationContext path = new ClassPathXMLApplicationContext( "configAnnotation.xml"); UserServiceImpl userService =(UserServiceImpl)path.getBean("userService"); userService.show(); } }
- annotation.rar (4.2 KB)
- 下载次数: 321
评论
7 楼
阳光泛滥的日子
2017-02-23
讲的很透彻,受教了 。
6 楼
liudechao9
2017-01-11
最近在研究这方面,很不错,但是多线程并发的时候可能会出问题,而且每new 一次ClassPathXMLApplicationContext 都会重新加载,建议加入到配置文件加载完成后执行,其他的还行,挺不错!
5 楼
小帅1127
2016-11-16
厉害啊 我的哥
4 楼
liyc98
2015-08-24
想请教下,像spring那种,没有set方法是如何注入的
3 楼
fairyhawk
2014-07-19
学习了不错。
在变量注释时fieldAnnotation()方法中注释没写name时是不默认用变量的名字??
不知道代码中写的这个for循环isAssignableFrom方法比较好用吗。我测试好像不可以。
在变量注释时fieldAnnotation()方法中注释没写name时是不默认用变量的名字??
if (resource.name() != null && !"".equals(resource.name())) { name = resource.name(); value = sigletions.get(name); } else { name=f.getName();//使用变量的默认名字 value = sigletions.get(name); }
不知道代码中写的这个for循环isAssignableFrom方法比较好用吗。我测试好像不可以。
for (String key : sigletions.keySet()) { // 判断当前属性所属的类型是否在配置文件中存在 if (f.getType().isAssignableFrom(sigletions.get(key).getClass())) { // 获取类型匹配的实例对象 value = sigletions.get(key); break; } }
2 楼
seraphim0930
2014-05-23
T[img][/img]his is the most beautiful article from now on !
1 楼
wujianjun12315
2011-07-21
不错。。。。 学习了。。。
发表评论
-
SpringMVC @ResponseBody和@RequestBody使用
2018-02-08 09:54 844@ResponseBody用法 作用: 该注解用 ... -
http请求中的header和body应用
2016-11-12 16:42 12598/** * 获取httpBody中的请求数据处理后并 ... -
spring管理bean原理
2011-06-03 15:24 19621、读取config.xml文件的bean标签放入数组,读取内 ... -
Spring AOP基础
2011-05-24 09:44 4731一、AOP是Aspect Oriented Programin ... -
spring注入原理
2011-05-19 14:05 20224IOC(Inverse of Control)可翻 ... -
spring+ibatis
2011-05-06 17:10 1327applicationContext.xml <!-- ... -
springMVC上传文件
2011-01-18 10:52 1569(1)、加入jar包: jxl-2.6.jar com ... -
spring 的工作机制和配置文件
2010-12-06 11:17 1062spring工作机制及为什么 ... -
spring中的事务管理
2010-11-04 14:35 11161、spring中声明式事务有两种配置方法:注解配置和xml形 ... -
Spring Web 相关工具类
2010-11-03 17:16 1026Web 相关工具类 您几乎总是使用 Spring ... -
spring 中的jdbc
2010-11-02 09:17 1705package org.spring.service; ... -
extjs3+springMVC上传文件
2010-04-02 09:46 67201.Ext代码 //formPanel表单的属性加入 fi ...
相关推荐
这是对Spring中注解是怎么实现的一个大概基本原理,条件是采取的理想状态,所以代码中还有缺陷的话请谅解,如果有需要的朋友可以放心下载,里面有详细的解释和流程。相信你能看懂
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
主要为大家详细介绍了Java注解机制之Spring自动装配实现原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了Spring的组合注解和元注解原理与用法,结合实例形式详细分析了spring组合注解和元注解相关功能、原理、配置及使用方法,需要的朋友可以参考下
@Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当Spring容器启动时,它会扫描所有带有@Scheduled注解的方法,并将它们注册到任务调度器中。任务调度器会根据注解中指定的时间间隔或Cron表达式来触发...
Spring纯注解实现方式(无XML配置) Spring整合Junit Spring分模块开发 Spring AOP原理分析 Spring AOP基于XML和注解的实现 Spring应用之Spring JDBC实现 Spring应用之JdbcDaoSupport ...
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
本文我们通过Spring AOP和Java的自定义注解来实现日志的插入功能,非常不错,具有一定的参考借鉴价值,需要的朋友一起看看吧
主要介绍了spring @Component注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
最终通过一个综合案例,实现灵活运用Spring框架中的各个部分。 2、适应人群 学习spring,要有一定的Java基础,同时应用过spring基于xml的配置。(或者学习过官网的Spring课程) 学习springmvc,要有一定java web...
Spring Ioc源码分析系列--@Autowired注解的实现原理.doc
12_编码剖析@Resource注解的实现原理 13.@Autowire注解与自动装配 14.让Spring自动扫描和管理Bean 15.使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP...
最后,我们详细分析了DubboConfigConfigurationRegistrar的registerBeanDefinitions方法,揭示了其如何利用Spring中的AnnotatedBeanDefinitionReader来读取注解的过程。整篇文章深入浅出,旨在帮助读者更好地理解...
主要介绍了Spring @CrossOrigin 注解原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
自己实现的雏形注解mvc(仿springmvc) 主要是为了练习下注解和servlet 帮助初学注解式spring的同学了解基本原理
Spring MVC常用注解及源码分析,详细介绍各个注解的使用常用以及实现原理分析
14.5.1.理解Spring.NET声明式事务管理的实现 14.5.2.第一个例子 14.5.3.Transaction特性的设置 14.5.4.通过AutoProxyCreator使用声明式事务 14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过...
阅读建议:此资源以开发 Spring Boot 集成 WebSocket 学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。