Spring (一) 加载配置文件,实例化类, 三种实例化bean的方式

xiaoxiao2021-02-28  108

Spring (一) 加载配置文件,实例化类

jar: dom4j.jar; jason-full.jar

public class JmiracleClassPathXmlApplicationContext { private List<BeanDefinition> bds = new ArrayList<BeanDefinition>(); private Map<String, Object> sigletons = new HashMap<String, Object>(); public JmiracleClassPathXmlApplicationContext (String filename) { readXml(filename); instanceBeans(); } private void readXml(String filename) { SAXReader reader = new SAXReader(); Document doc = null; try { URL xmlPath = this.getClass().getClassLoader().getResource(filename); // 可以获取bin目录下的资源文件 doc = reader.read(xmlPath); Map<String, String> nsMap = new HashMap<String, String>(); // 加入命名空间 nsMap.put("ns", "http://www.springframework.org/schema/beans"); // 创建beans/bean查询路径 XPath xsub = document.createXPath("//ns:beans/ns:bean"); // 设置命名空间 xsub.setNamespaceURIs(nsMap); // 获取文档下所有的bean List<Element> beans = xsub.selectNodes(document); for (Element e : beans) { String id = e.attributeValue("id"); String clazz = e.attributeValue("class"); BeanDefinition d = new BeanDefinition(id, clazz); bds.add(d); } } catch (Exception e) { e.printStackTrace(); } } private void instanceBeans() { for ( BeanDefinition beanD : bds ) { try { if ( beanD.getClassname() != null && !"".equals(beanD.getClassname())) { // 通过反射获取类名对应的实例 sigletons.put(beanD.getId(), Class.forName(beanD.getClassname()).newInstance()); } }catch (Exception e) { e.printStackTrace() } } } public Object getBean(String beanName) { return this.sigletons.get(beanName); } public static void main(String[] args) { JmiracleClassPathXmlApplicationContext ctx = new JmiracleClassPathXmlApplicationContext("application.xml"); IService service = (IService)ctx.getBean("service"); service.sayHello(); } } class BeanDefinition { private String id; private String classname; public BeanDefinition (String id, String classname) { this.id = id; this.classname = classname; } public String getId() { return this.id; } public void setId(String id ) { this.id = id; } public String getClassname () { return this.classname; } public void setClassname(String classname ) { this.classname = classname; } } interface IService { void sayHello(); } class ServiceImpl implements IService { public void sayHello () { System.out.println("ServiceImp -> sayHello"); } } // application.xml <bean id="service" class="ServiceImp" ></bean>

1、 三种实例化bean的方式 a. 使用类构造器实例化

<bean id="service" class="ServiceImpl" ></bean>

b. 使用静态工厂方法

<bean id="service" class="com.test.serviceFactory" factory-method="createService" ></bean> public class serviceFactory { public static ServiceImpl createService () { return new ServiceImpl(); } }

c. 使用实例工厂方法实例化

<bean id="serviceFactory" class="com.test.serviceFactory"></bean> <bean id="service" factory-bean="serviceFactory" factory-method="createService" ></bean> public class serviceFactory { public ServiceImpl createService () { return new ServiceImpl(); } }
转载请注明原文地址: https://www.6miu.com/read-23987.html

最新回复(0)