前一篇入门程序后,还是会有疑问,什么是bean?
Spring 可以被看作一个大型工厂,它的作用就是生产和管理Spring容器中的Bean,如果需要使用它,就要对Spring的配置文件进行配置。
Spring支持XML和Properites两种格式的配置文件,常用的就是XML格式配置,这种方式通过XML文件来注册并管理Bean之间的依赖关系。
XML配置文件的根元素是
,
中包含了多个
子元素,每一个
子元素定义了一个Bean,描述了该Bean如何被装配到Spring容器中。
元素的常用属性属性 | 描述 |
---|---|
id | Bean的唯一标识符 |
class | 指定了Bean的具体实现类(包含该类所在包) |
scope | 用来设置Bean作用域 |
init-method | Bean初始化方法 |
destroy-method | Bean销毁方法 |
factory-bean | Bean实例化时使用实例化工厂方式所需属性 |
factory-method | Bean实例化时使用静态/实例化工厂方式所需属性 |
元素的常用子元素子元素 | 描述 |
---|---|
constructor-arg | 使用此元素传入构造函数参数进行实例化(构造注入) |
property | 用于调用Bean实例中的setter方法完成属性赋值(设值注入) |
的属性/子元素属性/子元素 | 描述 |
---|---|
index(属性) | 指定构造函数的序号(从0开始) |
type(属性) | 指定构造参数的类型 |
ref/value(可作为子元素,属性) | 指定参数值/指定对Bean工厂中某个Bean实例的引用 |
ref/value(可作为子元素,属性) | 指定参数值 |
的属性/子元素属性/子元素 | 描述 |
---|---|
name(属性) | Bean实例中的相应属性名 |
ref/value(可作为子元素,属性) | 指定参数值/指定对Bean工厂中某个Bean实例的引用 |
ref/value(可作为子元素,属性) | 指定参数值 |
在Spring不常用,(题外话)但是Spring Boot中不使用XML配置后(用注解替代了),常用的是properties格式的配置文件,下面将通过简单例子描述
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 若报错,检查beans中有没有xmlns:context值和
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd -->
<context:property-placeholder location="classpath:application.properties" />
<bean id="bean4" class="${bean4}"></bean>
</beans>
package com.xhh.properties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Bean4Test {
public static void main(String[] args) {
String beanXmlPath = "com/xhh/properties/Bean4.xml";
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext(beanXmlPath);
Bean4 bean = (Bean4) applicationContext.getBean("bean4");
System.out.println(bean);
}
}
但还是用了XML,所以Spring中常用的还是XML,而Spring Boot用注解替代了在XML中配置Bean,Spring Boot的魅力。。。
在面向对象的程序中,如果想要使用某个对象,就要先实例化这个对象,同样在Spring中想要使用容器中的Bean,也需要实例化Bean。有三种方式:
代码如下:
Bean1.java
package com.xhh.constructor;
public class Bean1 {
}
Bean2.xml
<?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.xsd">
<bean id="bean1" class="com.xhh.constructor.Bean1">
</bean>
</beans>
Bean1Test.java
package com.xhh.constructor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Bean1Test {
public static void main(String[] args) {
String beanXmlPath = "com/xhh/constructor/Bean1.xml";
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext(beanXmlPath);
Bean1 bean = (Bean1) applicationContext.getBean("bean1");
System.out.println(bean);
}
}
这里提一下,在前一篇中我把xml文件命名为applicationContext.xml并放到src目录下,所以使用该配置文件时不需要写其路径,只需写名字,而这次我把它放到了自建的包中,就需要指明路径。。。如代码中所示
代码如下:
Bean2.java
package com.xhh.static_factory;
public class Bean2 {
}
Bean2Factory.java
package com.xhh.static_factory;
public class Bean2Factory {
public static Bean2 createBean() {
return new Bean2();
}
}
Bean2.xml
<?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.xsd">
<bean id="bean2" class="com.xhh.static_factory.Bean2Factory" factory-method="createBean">
</bean>
</beans>
Bean2Test.java
package com.xhh.static_factory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Bean2Test {
public static void main(String[] args) {
String beanXmlPath = "com/xhh/static_factory/Bean2.xml";
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext(beanXmlPath);
Bean2 bean = (Bean2) applicationContext.getBean("bean2");
System.out.println(bean);
}
}
Bean3.java
package com.xhh.instance_factory;
public class Bean3 {
}
InstanceFactory.java.java
package com.xhh.instance_factory;
public class InstanceFactory {
public InstanceFactory() {
System.out.println("Bean实例化工厂中");
}
private Bean3 createBean() {
return new Bean3();
}
}
Bean3.xml
<?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.xsd">
<bean id="instanceFactory" class="com.xhh.instance_factory.InstanceFactory">
</bean>
<bean id="bean3" factory-bean="instanceFactory" factory-method="createBean"></bean>
</beans>
Bean3Test.java
package com.xhh.instance_factory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xhh.static_factory.Bean2;
public class Bean3Test {
public static void main(String[] args) {
String beanXmlPath = "com/xhh/instance_factory/Bean3.xml";
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext(beanXmlPath);
Bean3 bean = (Bean3) applicationContext.getBean("bean3");
System.out.println(bean);
}
}