引入Spring所需依赖(即导入jar包后),即可以开始设计Spring框架的入门程序。
创建普通类User
public class User{
public void add(){
System.out.println("ADD方法");
}
}
创建Spring配置文件:
<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="user" class="com.jarvis.bean.User">bean>
beans>
使用测试方法获取对象
@Test
public void test1(){
//获取应用程序上下文对象
ApplicationContext context = ClassPathXMLApplicationContext("bean.xml");
//使用应用程序上下文对象获取Bean对象
User user = context.getBean("user" , User.class);
user.add();
}
,通过解析xml文件,来根据配置信息创建相应的工厂类Class clazz = Class.forName(classValue)
和clazz.newInstance()
创建目标对象
。其中id属性是唯一标识,用于给Bean对象创建唯一标识,也是获取(创建)Bean的标识;class属性用于指明对象的全路径。在创建对象时默认使用newInstance()无参构造方法。
,name属性需要和类中对应属性一致。
,name属性需要和类中有参构造方法中的参数一致
,随后既可以在bean标签中使用p属性进行属性注入:
<util:list id="list1">
<value>数据项1value>
<value>数据项2value>
<value>数据项3value>
util>
<bean id="" class="">
<property name="list" ref="list1">
property>
bean>
public class MyBean implments FactoryBean<User>{
@Override
public User getObject() throws Exception{
User user = new User();
user.setName("jarvis");
return user;
}
}
//在xml文件中的配置为,只需要指向实现了工厂Bean接口的该类即可
<bean id="user" class="com.jarvis.bean.MyBean"></bean>
//在test测试使用时,可以发现返回的并不是MyBean类型,而是User类型
public void test(){
ApplicationConetxt context = new ClassPathXMLApplicationContext("bean.xml");
User user = context.getBean("user",User.class);
}
Bean的作用域
在Spring中可以设置创建好的Bean实例是单例还是多例。在默认情况下,使用IOC创建出的Bean是单例对象,即无论创建多少个对象引用,指向的都是唯一一个对象。
在bean标签中存在有scope属性,可以用于设置创建出的对象是单例还是多例:
,singleton表示获取bean对象时会获得单例bean对象,prototype表示会获得多例对象。此外scope属性还有request
和session
等值,表示在bean对象创建好后会保存在哪个域中。
bean的生命周期
生命周期是指bean对象从对象创建到销毁的过程:
class User{
public User(){}
public void initMethod(){}
public void destoryMethod(){}
}
//在xml中配置
<bean id="" class="" init-method="initMethod" destory-method="destoryMethod"></bean>
postProcessorBeforeInitialization
方法进行处理postProcessorAfterInitialization
方法进行处理//实现beanPostProcessor接口
public class BeanPost() implments BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//执行后置处理器的操作
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//执行后置处理器操作
return bean;
}
}
//在xml文件中进行配置
<bean id="beanPost" class="com.jarvis.bean.BeanPost"></bean>
这样就可以对同一xml文件中生命的bean对象统一执行该后置处理器的操作。
<bean id="emp" class="com.jarvis.beanEmp" autowire="byType">
bean>
<bean id="dept" class="com.jarvis.bean.Dept">bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">property>
<property name="url" value="jdbc:mysql://localhost:3306/book">property>
<property name="username" value="root">property>
<property name="password" value="root">property>
bean>
外部文件信息
prop.dirverClassName=com.mysql.jdbc.Driver
prop.url=http://localhost:3306/book
prop.username=root
prop.password=root
引入外部文件
<context:property-placeholder location="classpath:jdbc.properties">
使用外部文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.username}">property>
<property name="url" value="http:localhost:3306/book">property>
<property name="username" value="root">property>
<property name="password" value="root">property>
bean>
<context:component-scan base-package="需要扫描的组件包">context:component-scan>
注意:组件扫描还可以对细节进行配置
use-default-filter属性:表示是否使用默认filter,默认为true
context:include-filter和context:exclude-filter标签可以设置指定过滤器扫描或者忽略指定的组件
<context:component-scan base-package="com.jarvis" use-default-filter="false">context:component-scan>
//表示自定义的过滤器会只扫描带有该注解的类
<conetxt:include-filter type="annotation" expression="org.springframework.stereotype.Controller">conetxt:include-filter>
//表示自定义的过滤器会忽略带有该注解的类
<conetxt:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller">conetxt:include-filter>
@Component
public class User{
@Value(value="小明")
private String name;
@Value(value="123456")
private Integer id;
//@Autowired ---------------------------- 表示会根据类型注入,前提是该类需要由Spring实现自动创建
//@Qualifier(value="dept") -------------- 表示会根据名称注入
//@Resource ----------------------------- 表示会根据类型注入
//@Resource(value="dept") --------------- 表示会根据名称注入
private Dept department;
}
@Configuration //表示该类是用作配置类代替配置文件存在的
@ComponentScan(basePackages="com.jarvis")
public class ConfigurationClass{}
public void test(){
ApplicationContext context = AnnotationConfigApplicationContext(ConfigurationClass.class);
context.getBean(...);
}