使用反射创建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 ...
随机推荐
- 空间搜索(圆范围)中Geohash编码方案和网格编码方案对比探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 多个项目中实现范围(圆)搜索的方案为:依赖库表中的X和Y字段构 ...
- python 装饰器统计某个函数的运行时间
import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...
- DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)
前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...
- [SDOI 2013]森林
Description 题库链接 给你 \(n\) 个节点,初始 \(m\) 条边, \(t\) 组操作.让你支持: 询问树上路径点权 \(K\) 小: 支持加边操作. 强制在线,所有状态保证是一个树 ...
- noip2017"退役"记
day0 口胡了一下去年的六道题,感觉很稳,看了6集动漫,0点钟就去睡了. day1 早上被一阵革命练习曲吵醒,而我还是窝在被子里不想起床(-﹃-)~zZ.于是室友开始放起了lost river... ...
- linux心得
cd .. 返回上一级文件夹cd /xxx/xxxx/xx 进入文件夹cd Desktop 进入桌面sudo vim /etc/vim/vimrc 进入vim配置器:w xxx 保存为名为xxx的文件 ...
- SparkSQL——用之惜之
SparkSql作为Spark的结构化数据处理模块,提供了非常强大的API,让分析人员用一次,就会为之倾倒,为之着迷,为之至死不渝.在内部,SparkSQL使用额外结构信息来执行额外的优化.在外部,可 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- jquery 实现图片无缝向左滚动
<script type="text/javascript" src="_pub/Script/jquery.js"></script> ...
- PLSQL(2)
游标 [1] 不带参数的游标 -- 取出EMP表中的所有人名字 DECLARE CURSOR C IS SELECT * FROM EMP; V_EMP ...