反射-Spring管理Bean,注入Bean属性的反射机制。

#反射

1.是JAVA API,是Java提供的现成的类!!

  --接受API提供的功能!

2. 是Java提供的动态执行机制,动态加载类,动态创建对象,动态访问属性,动态调用方法。

##反射用途

1. eclipse 中解析类的结构使用了反射

2.JUnit识别被测试方法使用了反射

  -- JUnit3 利用了反射查找test开头的方法

  -- JUnit4 利用了反射解析@Test查找测试方法

3.Spring 管理Bean对象,注入Bean属性使用了反射

  --利用反射创建Bean对象实例

  --利用反射注入Bean的属性

4.注解的解析使用了反射

  --利用反射API支持注解

5. 强行执行私有方法(访问私有属性)

分析图解:

CLASS--package: main/springstru 、main/resources

------------------------------              分割线             -----------------------

springstru/ApplicationContext.java

package springstru;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ApplicationContext {
    //是缓存Spring容器的Bean对象
    private Map<String,Object> beans = new HashMap<String, Object>();
    /**
     * 利用配置文件初始化当前容器
     * 利用xml配置文件,初始化全部的Bean对象
     */
    public ApplicationContext(String xml) throws Exception{
        //利用DOM4j,读取xml文件
        //解析XML文件内容,得到Bean的类名和Bean的ID:
        //根据类名动态加载类并且创建对象,
        //将对象和对应的ID添加到map中
        //从Resource(classpath)中读取流
        InputStream in = getClass().getClassLoader().getResourceAsStream(xml);
        SAXReader reader = new SAXReader();
        Document doc = reader.read(in);
        in.close();
        //解析xml :<beans><bean><bean><bean><bean>.....
        Element root = doc.getRootElement();
        //读取根元素中全部的bean子元素
        List<Element> list = root.elements("bean");
        for(Element e:list){
            //e 就是bean元素id属性和class属性
            String id = e.attributeValue("id");
            String className = e.attributeValue("class");
            //动态加载类,动态创建对象
            Class cls = Class.forName(className);
            Object bean = cls.newInstance();
            beans.put(id,bean);
        }
    }

    public Object getBean(String id){
        //根据id在map查找对象,并返回对象
        return beans.get(id);
    }
    //使用泛型方法:优点是可以减少一次类型转换
    public<T> T getBean(String id,Class<T> cls){

        return (T)beans.get(id);
    }
}

------------------------------              分割线             -----------------------

springstru/Demo.java

package springstru;

public class Demo {

    public static void main(String[] args) throws Exception{
        ApplicationContext ctx = new ApplicationContext("spring-context.xml");
        Foo foo = (Foo)ctx.getBean("foo");
        Foo f2 = ctx.getBean("foo", Foo.class);
        System.out.println(foo);
        System.out.println(f2);
    }

}

------------------------------              分割线             -----------------------

/resources/spring-context.xml

<beans>
    <!-- 配置bean元素 -->
    <bean id="foo" class="springstru.Foo"></bean>
    <bean id="date" class="java.util.Date"></bean>
    <bean id="testCase" class="demo.TestCase"></bean>
</beans>
时间: 2024-10-10 22:07:18

反射-Spring管理Bean,注入Bean属性的反射机制。的相关文章

Spring学习笔记--注入Bean属性

这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.springframework.context.ApplicationContext; import org.springframework.context.support.Clas

spring boot 动态注入bean

方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext applicationContext; //获取上下文 public static ApplicationContext getApplicationContext() { return applicationContext; } //设置上下文 public static void setApplicationCont

Spring注解自动注入Bean

我们知道采用Spring注解时,配置如下: [html] view plaincopy <context:annotation-config /> <context:component-scan base-package="cn.itkt"></context:component-scan> 这样的话,在com包及其所有子包下的所有类如果含有@Component.@Controller.@Service.@Repository等注解的话都会自动纳入到

Spring项目获取注入bean集合

import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { private static ApplicationContext ctx; public static void main(String[] args) { try { ctx = new Clas

解决Spring+Quartz不能注入Bean的问题

Spring application-quartz的配置<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http:

在main方法中初始化spring环境,注入bean

public static void main(String[] args) { LOGGER.info("==启动APP日志队列程序=="); SpringUtils.getBean(UserAppLogConsumerListener.class); } 一开始我是使用自定义的spring工具类的getBean方法进行初始化,但是存在问题:配置文件中用有引用UserAppLogConsumerListener这个bean,导致报错expected single matching b

Spring注解方式注入Bean 究竟应该选择哪种?

这篇文章写得很好,还有StackOverFlow上的 这个

Spring框架-构造注入的属性问题-type属性

还是使用上面一个小demo,进行测试,验证一个问题,废话不多说了,上代码进行比较 1 package service.impl; 2 3 import service.UserService; 4 import dao.UserDao; 5 import entity.User; 6 7 /** 8 * 用户业务类,实现对User功能的业务管理 9 */ 10 public class UserServiceImpl implements UserService { 11 12 // 声明接口类

Spring学习笔记6---bean配置和bean注入

1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用. 1 bean配置 bean配置有三种方法: 基于xml配置Bean 使用注解定义Bean 基于java类提供Bean定义信息 1.1 基于xml配置Bean 对于基于XML的配置,S