工作已经有三年了,一直有在用Spring,但是一直没有整理过细节,从现在开始整理一下spring的基础知识。
一:环境准备
从零开始,先创建个maven项目,打开IDEA,选择File->NewProject->Maven
选择Create from archetype,勾选maven-archetype-quickstart
然后修改pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
在新建一个资源文件resources和java同级:在File->ProjectStructure->Module设置。
目录结构如下
环境搭建完毕。
二:xml中bean的配置
2.1Set注入
Spring的注入分三种:set注入,构造注入,接口注入。其中接口注入侵略性太强,不做讲解。
创建BasicBean
public class BasicBean {
private String bean;
private Integer num;
//构造方法 get set
}
在资源文件目录下创建spring.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--set注入-->
<bean class="com.cch.demo.bean.BasicBean" name="basicBean">
<property name="bean" value="testBean"/>
<property name="num" value="1"/>
</bean>
</beans>
创建一个测试类Main
public class Main {
private ApplicationContext ac;
@Before
public void testBefore(){
ac = new ClassPathXmlApplicationContext(new String[]{"classpath:spring.xml"});
}
@Test
public void testBasic(){
BasicBean basicBean = ac.getBean("basicBean",BasicBean.class);
System.out.println("bean:"+basicBean.getBean()+" num:"+basicBean.getNum());
basicBean.setNum(5);
BasicBean basicBean2 = (BasicBean)ac.getBean("basicBean");
System.out.println("bean:"+basicBean2.getBean()+" num:"+basicBean2.getNum());
}
}
执行结果如下:
bean:testBean num:1
bean:testBean num:5
bean:testBean num:5
说明spring成功管理了我们的BasicBean。
接下来代码都是基于以上环境继续开发。
2.2构造注入
spring.xml新增
<!--构造器注入-->
<bean class="com.cch.demo.bean.ListBean">
<constructor-arg name="list">
<list>
<value>"zhangsan"</value>
<value>"lisi"</value>
</list>
</constructor-arg>
</bean>
新建类ListBean
public class ListBean {
public List<String> list;
}
get set 构造方法请自行实现。
@Test
public void testList(){
ListBean listBean = ac.getBean(ListBean.class);
System.out.println(listBean.getList());
}
测试结果如下:
["zhangsan", "lisi"]
2.3map set的使用
spring.xml新增
<bean class="com.cch.demo.bean.MapBean">
<property name="map">
<map>
<entry key="k1" value="v1" />
<entry key="k2" value="v2" />
</map>
</property>
</bean>
<bean class="com.cch.demo.bean.SetBean">
<property name="set">
<set>
<value>1</value>
<value>"22"</value>
</set>
</property>
</bean>
新增类MapBean Se't'Bean
public class MapBean {
private Map<String,String> map;
}
public calsss SetBean{
private Set set;
}
测试类新增
@Test
public void testMap(){
MapBean mapBean = ac.getBean(MapBean.class);
System.out.println(mapBean.getMap());
}
@Test
public void testSet(){
SetBean setBean =ac.getBean(SetBean.class);
System.out.println(setBean.getSet());
}
2.4xml中同一个类配置多个
配置同一个类多次 需要以id或name区分
<bean class="com.cch.demo.bean.BasicBean" id="testBean">
<property name="bean" value="testBean"/>
<property name="num" value="1"/>
</bean>
<bean class="com.cch.demo.bean.BasicBean" id="test2Bean" name="test2Bean">
<constructor-arg index="0" value="lala" />
<constructor-arg index="1" value="3" />
</bean>
2.5使用自动注入
创建BigBean BeInjectedBean
@Component
public class BeInjectedBean {
private int num;
}
public BeInjectedBean(){
this.num=3;
}
使用了@Componet是隐式的,所以需要增加一下Spring的扫描路径。
<context:component-scan base-package="com.cch.demo.bean" />
<bean class="com.cch.demo.bean.BigBean"></bean>
@Test
public void testBigBean(){
BigBean bigBean = ac.getBean(BigBean.class);
System.out.println("num:"+bigBean.getBeInjectedBean().getNum());
}
结果如下:
num:3
2.6在xml引用已经配置的bean
<bean class="com.cch.demo.bean.OtherBean">
<property name="basicBean" ref="testBean"></property>
</bean>
public class OtherBean {
public BasicBean basicBean;
}
@Test
public void testOther(){
OtherBean otherBean = ac.getBean(OtherBean.class);
System.out.println("bean:"+otherBean.getBasicBean().getBean()+" num:"+otherBean.getBasicBean().getNum());
}
结果如下:
bean:testBean num:1
相信大家已经会简单的使用spring的bean配置了。
源码地址如下:
https://github.com/13127898836/spring-demo/tree/master/springdemo02