- 浏览: 596032 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id = "injectTestDao" class="test.Inject.InjectTestDao" /> <bean id = "injectTestService" class = "test.Inject.InjectTestServiceImpl" /> </beans>
Bean定义类:
package test.Inject; import java.util.ArrayList; import java.util.List; /** * xml中的<bean/>的定义 * @author Administrator * */ public class BeanDefinition{ private String id; private String clazz; private List<PropertyDefinition> propertyDefinitions=new ArrayList<PropertyDefinition>(); public BeanDefinition(String id, String clazz) { super(); this.id = id; this.clazz = clazz; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public List<PropertyDefinition> getPropertyDefinitions() { return propertyDefinitions; } public void setPropertyDefinitions(List<PropertyDefinition> propertyDefinitions) { this.propertyDefinitions = propertyDefinitions; } }
Property定义类用于读取 <bean><property>
package test.Inject; public class PropertyDefinition { private String name; private String ref; private String value; public PropertyDefinition(String name, String ref,String value) { super(); this.name = name; this.ref = ref; this.value=value; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRef() { return ref; } public void setRef(String ref) { this.ref = ref; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
注释类:
package test.Inject; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * ElemenetType.CONSTRUCTOR 构造器声明 * ElemenetType.FIELD 域声明(包括 enum 实例) * ElemenetType.LOCAL_VARIABLE 局部变量声明 * ElemenetType.METHOD 方法声明 * ElemenetType.PACKAGE 包声明 * ElemenetType.PARAMETER 参数声明 * ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 * * @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: * RetentionPolicy.SOURCE 注解将被编译器丢弃 * RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 * RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信* 息。 * * @Documented 将此注解包含在 javadoc 中 * @Inherited 允许子类继承父类中的注解 * */ // 在运行时执行 @Retention(RetentionPolicy.RUNTIME) // 注解适用地方(字段和方法) @Target({ ElementType.FIELD, ElementType.METHOD }) public @interface LwxResource { //注解的name属性 @LwxResource(name="dddd") public String name() default ""; }
要注入的类:
package test.Inject; /** * @Description: 要注入的Dao类 * @ClassName: InjectTestDao * @Project: spring-aop */ public class InjectTestDao { public void show(){ System.out.println("这里是dao方法........"); } }
带有注释的类:
package test.Inject; /** * @Description: 带有注解的服务 * @ClassName: InjectTestServiceImpl * @Project: spring-aop * @Author: lwx */ public class InjectTestServiceImpl { // 字段上的注解,可以配置name属性 @LwxResource public InjectTestDao injectTestDao; // // set方法上的注解,带有name属性 // @LwxResource(name = "injectTestDao") // public void setInjectTestDao(InjectTestDao injectTestDao) { // this.injectTestDao = injectTestDao; // } public void show() { injectTestDao.show(); System.out.println("这里是Service方法........"); } }
注释处理类
package test.Inject; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.ConvertUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.io.SAXReader; /** * 自定义容器 * * @author Administrator * */ public class UserDefinedClassPathXMLApplicationContext { private List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>(); private Map<String, Object> sigletons = new HashMap<String, Object>(); public UserDefinedClassPathXMLApplicationContext(String filename) { this.readXML(filename); this.instanceBeans(); this.annotationInject(); this.injectObject(); } /** * 读取xml配置文件 * * @param filename */ @SuppressWarnings("all") private void readXML(String filename) { SAXReader saxReader = new SAXReader(); Document document = null; try { URL xmlPath = this.getClass().getClassLoader() .getResource(filename); document = saxReader.read(xmlPath); XPath xPath = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean查询路径。从根路径开始 Map<String, String> nsMap = new HashMap<String, String>(); nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空间 xPath.setNamespaceURIs(nsMap);// 设置命名空间 List<Element> beans = xPath.selectNodes(document);// 获取文档下所有bean节点 for (Element element : beans) { String id = element.attributeValue("id"); String clazz = element.attributeValue("class"); BeanDefinition beanDefinition = new BeanDefinition(id, clazz); XPath xPath2 = element.createXPath("ns:property");// 从相对路径开始 xPath2.setNamespaceURIs(nsMap); List<Element> propertys = xPath2.selectNodes(element); for (Element element2 : propertys) { String name = element2.attributeValue("name"); String ref = element2.attributeValue("ref"); String value = element2.attributeValue("value"); PropertyDefinition propertyDefinition = new PropertyDefinition( name, ref, value); beanDefinition.getPropertyDefinitions().add( propertyDefinition); } beanDefinitions.add(beanDefinition); } } catch (DocumentException e) { e.printStackTrace(); } } /** * 完成bean的实例化 */ private void instanceBeans() { try { for (BeanDefinition beanDefinition : beanDefinitions) { if (beanDefinition.getClazz() != null && !"".equals(beanDefinition.getClazz().trim())) { sigletons.put(beanDefinition.getId(), Class.forName( beanDefinition.getClazz()).newInstance()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 为bean对象的属性注入值 * * @throws IntrospectionException * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ private void injectObject() { try { for (BeanDefinition beanDefinition : beanDefinitions) { Object bean = sigletons.get(beanDefinition.getId()); if (bean != null) { PropertyDescriptor[] ps = Introspector.getBeanInfo( bean.getClass()).getPropertyDescriptors(); for (PropertyDefinition propertyDefinition : beanDefinition .getPropertyDefinitions()) { for (PropertyDescriptor propertyDescriptor : ps) { if (propertyDefinition.getName().equals( propertyDescriptor.getName())) { Method setterMethod = propertyDescriptor .getWriteMethod();// 获取属性的setter方法 if (setterMethod != null) { Object temp = null; if (propertyDefinition.getRef() != null && !"".equals(propertyDefinition .getRef().trim())) { temp = sigletons.get(propertyDefinition .getRef()); } else if (propertyDefinition.getValue() != null && !"".equals(propertyDefinition .getValue().trim())) { temp = ConvertUtils.convert( propertyDefinition.getValue(), propertyDescriptor .getPropertyType()); } setterMethod.setAccessible(true);// 防止setter方法为private setterMethod.invoke(bean, temp);// 把引用对象注入到属性 } break; } } } } } } catch (Exception e) { e.printStackTrace(); } } /** * 通过注解实现注入依赖对象 * * @throws IntrospectionException * @throws InvocationTargetException * @throws IllegalAccessException * @throws IllegalArgumentException */ private void annotationInject() { try { for (String beanName : sigletons.keySet()) { Object bean = sigletons.get(beanName); if (bean != null) { PropertyDescriptor[] ps = Introspector.getBeanInfo( bean.getClass()).getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : ps) { Method setterMethod = propertyDescriptor .getWriteMethod(); if (setterMethod != null && setterMethod .isAnnotationPresent(LwxResource.class)) { LwxResource userDefinedResource = setterMethod .getAnnotation(LwxResource.class); Object temp = null; if (userDefinedResource.name() != null && !"".equals(userDefinedResource.name())) { // 一旦指定了name属性,就只能按名称装配了 temp = sigletons .get(userDefinedResource.name()); } else { temp = sigletons.get(propertyDescriptor .getName()); if (temp == null) { for (String key : sigletons.keySet()) { if (propertyDescriptor .getPropertyType() .isAssignableFrom( sigletons.get(key) .getClass())) { temp = sigletons.get(key); break; } } } } setterMethod.setAccessible(true); setterMethod.invoke(bean, temp);// 把引用对象注入到属性 } } Field[] fields = bean.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(LwxResource.class)) { LwxResource userDefinedResource = field .getAnnotation(LwxResource.class); Object temp = null; if (userDefinedResource.name() != null && !"".equals(userDefinedResource.name())) { temp = sigletons .get(userDefinedResource.name()); } else { System.out.println(field.getName()); temp = sigletons.get(field.getName()); if (temp == null) { for (String key : sigletons.keySet()) { if (field.getType().isAssignableFrom( sigletons.get(key).getClass())) { temp = sigletons.get(key); break; } } } } field.setAccessible(true);// 允许访问private字段 field.set(bean, temp); } } } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取bean实例 * * @param beanName * @return */ public Object getBean(String beanName) { return this.sigletons.get(beanName); } public static void main(String[] args) { //读文件的地址是从src下开始读的 也就是 src\test\Inject\injectTest.xml地址 UserDefinedClassPathXMLApplicationContext applicationContext = new UserDefinedClassPathXMLApplicationContext( "test\\Inject\\injectTest.xml"); InjectTestServiceImpl injectTestService = (InjectTestServiceImpl) applicationContext .getBean("injectTestService"); injectTestService.show(); } }
发表评论
文章已被作者锁定,不允许评论。
相关推荐
这个"hibernate+spring注解例子"项目提供了一个实际的登录场景,帮助学习者更好地理解和运用这两个框架的注解特性。通过深入学习和实践,开发者能够提高开发效率,降低出错概率,为构建高效、稳定的Java应用程序打下...
在IT行业中,Spring框架...在"Spring集成JPA和MyBatis简单例子-20170622"这个压缩包中,可能包含了示例代码,演示了如何在Spring项目中配置和使用这两种技术,这对于初学者理解和实践Spring的集成能力具有很大的帮助。
本例子“spring代码例子--精选”旨在为初学者提供一个简单易懂的起点,帮助他们快速理解和掌握Spring框架的基本用法。 首先,让我们深入了解一下Spring框架的核心概念。Spring框架主要由以下几个模块组成: 1. **...
在这个"struts2+mybatis+spring 注解很好的例子"中,开发者可能已经展示了如何在Struts2的Action类中使用Spring的注解来注入Service,然后在Service中利用MyBatis的注解进行数据库操作。整个流程可能包含以下步骤: ...
**Spring AOP 注解例子详解** 在 Spring 框架中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许我们分离关注点,将业务逻辑与系统服务(如日志、事务管理等)解耦。在 Spring AOP...
Spring 2.5增强了对AOP的支持,`@Aspect`和`@Before`、`@After`、`@Around`、`@AfterReturning`、`@AfterThrowing`等注解使得编写切面变得直接且易读。开发者可以使用这些注解定义通知,并精确控制何时以及如何执行...
本篇文章将详细介绍如何在Struts2和Spring框架中结合使用注解进行配置,以简化开发过程。 首先,让我们了解Spring框架中的注解配置。Spring提供了如@Component、@Service、@Repository和@Controller等注解,用于...
此时,无需编写任何实现类,Spring会自动为`UserMapper`生成一个实现了该接口的代理类,并将其注入到需要的地方。 此外,MyBatis-Spring还支持将Mapper接口的方法直接作为`@Autowired`注解的目标,这样就可以在...
Spring 2.5引入了@Autowired注解,它极大地简化了配置,允许开发者在不编写XML配置文件的情况下完成bean的自动装配。本文将深入探讨@Autowired注解以及如何在Spring中使用它。 @Autowired注解的主要作用是自动将所...
2. **Spring MVC** Spring MVC是Spring框架的一部分,主要处理Web请求。它包括DispatcherServlet、Controller、ViewResolver、ModelAndView等核心组件。DispatcherServlet作为前端控制器接收请求,通过...
Mybatis+Spring 整合是Java开发中常见的技术组合,尤其在企业级应用中广泛使用。这个整合小例子是为初学者设计的,旨在帮助入门者...通过实际操作,你可以更深入地理解这两个框架的协同工作原理,提升自己的开发技能。
本文将深入探讨Spring注解注入的原理、使用方法及示例。 首先,让我们了解Spring注解注入的基本概念。在Java中,注解是一种元数据,它提供了在源代码中附加信息的方式。Spring框架支持多种注解,如`@Autowired`、`@...
通过这个"spring mvc step by step"的例子,我们可以深入学习Spring MVC的每一个组件,理解它们如何协同工作,以及如何在实际项目中运用。这个例子会提供一个基础的Spring MVC应用,包括Controller的创建、视图的...
Spring注解如`@Component`、`@Service`、`@Repository`和`@Controller`用于标记bean,使得Spring容器能够自动检测和管理这些bean。此外,`@Autowired`注解用于自动装配bean的依赖,而`@Transactional`注解则可以声明...
在本示例中,我们探讨的是一个基于Spring MVC和JdbcTemplate的非注解式应用程序,该程序可能用于...在实际项目中,虽然注解式的配置更受青睐,但了解非注解方式有助于理解Spring的工作原理,特别是对于老项目的维护。
"spring第一个学习的例子"旨在帮助初学者快速入门Spring框架,通过实际操作理解其基本概念和工作原理。 首先,Spring的核心特性之一是依赖注入(Dependency Injection,简称DI)。这个例子可能包含了如何在配置文件...
下面我们将深入探讨如何利用Spring注解实现Quartz定时执行功能。 首先,我们需要引入Quartz和Spring的相关依赖。在Maven的pom.xml文件中添加以下依赖: ```xml <groupId>org.quartz-scheduler <artifactId>...
以下是对"spring注解事务管理"这一主题的详细解释。 ### 1. Spring事务管理的基本概念 Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、...
通过学习这个例子,开发者可以更好地理解SSH框架的工作原理,为今后的项目开发打下坚实的基础。同时,注解的使用也是现代Java开发中的一个重要趋势,熟悉这些注解将有助于适应更多的Java框架和库。
标签 "springboot-2" 和 "dubbo-2.6.x" 明确了项目所使用的具体技术版本。Spring Boot 2.0.x 引入了许多改进和新特性,包括对 Spring Framework 5 和 Java 9 的支持,以及更好的性能和稳定性。而 Dubbo 2.6.x 版本则...