使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法
获取Class类实例的方法:
类名.class
实例名.getClass()
Class.forName(className)
public class RefTest {
@Test
public void testRef(){
//Class cls = RefTest.class;
//Class.forName("com.jboa.service.RefTest");
//new RefTest().getClass();
}
Class类中包含getConstructors()、getFields()、getMethods();
在test写一个测试的实体类:
package com.jboa.service;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Spring中是如何根据类名配置创建Bean实例的呢?下面代码:
package com.jboa.service;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.junit.Test;
public class RefTest {
@Test
public void testRef() throws Exception {
//Class cls = RefTest.class;
//Class.forName("com.jboa.service.RefTest");
//new RefTest().getClass();
Object obj = getBean("com.jboa.service.User");
this.setProperty(obj, "username", "admin");
this.setProperty(obj, "password", "passw");
User user = (User) obj; //对应ClassPathXmlApplicationContext.getBean(id)
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
public Object getBean(String className) throws Exception {
Class cls = null;
try {
cls = Class.forName(className);//对应Spring ->bean -->class
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new Exception("类错误!");
}
Constructor[] cons = null;//得到所有构造器
try {
cons = cls.getConstructors();
} catch (Exception e) {
e.printStackTrace();
throw new Exception("构造器错误!");
}
if (cons == null || cons.length < 1) {
throw new Exception("没有默认构造方法!");
}
//如果上面没错,就有构造方法
Constructor defCon = cons[0];//得到默认构造器,第0个是默认构造器,无参构造方法
Object obj = defCon.newInstance();//实例化,得到一个对象 //Spring - bean -id
return obj;
}
public void setProperty(Object bean, String propertyName, Object propertyValue) throws Exception {
Class cls = bean.getClass();
Method[] methods = cls.getMethods();//得到所有方法
//cls.getFields();//所有公开字段属性
//注入属性 用户名:admin setUsername();
// obj username admin
//String propertyName = "username";//对应 Spring配置文件- property ->name
//String propertyValue = "admin";//对应:Spring -- property -->ref/value
for (Method m : methods) {
if (m.getName().equalsIgnoreCase("set" + propertyName)) {
//找到方法就注入
m.invoke(bean, propertyValue);
break;
}
}
}
}
运行;
参考的bean:
<bean id="employeeAction" class="com.jboa.action.EmployeeAction" scope="prototype"> <property name="employeeService" ref="employeeService"></property> <property name="dictionaryService" ref="dictionaryService"></property> </bean>
使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法的更多相关文章
- spring中的aop的xml配置方式简单实例
aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征 ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- Spring中多配置文件以及寻觅引用其他bean的方式
Spring多配置文件有什么好处? 按照目的.功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理.数据源等少改动的配置与配置bean单独分开. Spring读取配置文件的几种方式: ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- Spring 中如何自动创建代理(spring中的三种自动代理创建器)
Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...
- Spring中各种扩展原理及容器创建原理
一.BeanFactoryPostProcessor BeanFactory的后置处理器:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保 ...
- (4) Spring中定时任务Quartz集群配置学习
原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...
- Spring中Druid链接池的配置
本文记录了使用Druid的方法, 包括Spring和Spring boot中使用Druid的配置方法. Spring中配置Druid连接池 以链接mysql为例 1 添加druid依赖 <dep ...
- Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz. Spring中使用Quartz的3种方法(MethodInvokingJobDetailFactoryBean,i ...
随机推荐
- 关于装双系统Ubantu16.04+Win10引导问题
1.装完双系统,必定会遇到时间不一致的问题解决问题如下 sudo apt-get install ntpdate sudo ntpdate time.windows.com sudo hwclock ...
- HDU 2082 找单词
Problem Description 假 设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字 ...
- python dataframe数据条件筛选
一般情况下我们从一堆数据中选择我们获取想要的数据会通过一下方式: (1)创建链表或数组: (2)用for 循环遍历所有数据,将想要的存入链表或数组. 但是python中我们不需要这么做,我们可以用Pa ...
- Win7删除文件夹提示找不到该项目无法删除
在使用win7操作系统的过程中,有一些朋友会遇到这种情况,因为某种不明原因,硬盘里面某一个文件夹无法删除,表现为在删除的时候,系统提示找不到该项目,即找不到该文件夹,就像它变成了幽灵一样,看得到却摸不 ...
- 63. Unique Paths II(中等, 能独立做出来的DP类第二个题^^)
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- SQL注入原理及绕过安全狗
1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...
- 通过AIDL在两个APP之间Service通信
一.项目介绍 [知识准备] ①Android Interface definition language(aidl,android接口定义语言),其目的实现跨进程的调用.进程是程序在os中执行的载体, ...
- python学习之路web框架
WEB框架的本质 python的WEB框架分为两大类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理 ...
- java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
解决此异常的方法是: 删除您添加在Referenced Libraries 下的catalina.jar包, 然后删除Webapp下的部署程序,重新部署后一切正常. ? --------------- ...
- iOS支付宝,微信,银联支付集成封装调用(下)
一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部 ...