本文主要是总结一下Spring中的配置元数据,以及Spring容器的创建和使用。
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。IoC容器是Spring Application Framework的核心。IoC容器主要职责是对应用程序的对象进行实例化、初始化、装配,以及在对象的整个生命周期中提供其他的Spring功能。那些构成应用程序的主要部分,并由Spring管理的对象称为Bean(也是普通的POJO)。
1.1 配置元数据
配置元数据:向Spring容器提供相关信息来实例化Bean,并指定如何装配这些Bean。
Spring容器首先获取应用程序类,并与配置元数据结合在一起,然后创建和装配Bean。
1.2 SpringBean
Bean主要有:Ad(广告类),AdDao接口,AdDao实现类AdDaoIDBCImpl,AdService接口,以及AdService的实现类AdServiceImpl。
//广告类
public class Ad extends BaseBean {
private Long id; //id唯一标识符
private String title; //标题
private String imgFileName;//图片文件名
private String link; //链接地址
private Long weight; //权重
//setter和getter方法省略
}
public interface AdDao {
/**
* 新增
* @param ad 广告表对象
* @return 影响行数
*/
int insert(Ad ad);
}
public class AdDaoJDBCImpl implements AdDao {
@Override
public int insert(Ad ad) {
//插入数据库操作
}
}
public interface AdService {
/**
* 新增广告
* @param adDto
* @return 是否新增成功:true-成功;fale-失败
*/
boolean add(AdDto adDto);
}
public class AdServiceImpl implements AdService {
private AdDao adDao;
public void setAdDao(AdDao adDao){
this.adDao=adDao;
}
@Override
public boolean add(AdDao adDao) {
Ad ad = new Ad();
ad.setTitle(adDto.getTitle());
ad.setLink(adDto.getLink());
ad.setWeight(adDto.getWeight());
try {
ad.setImgFileName("");
adDao.insert(ad);
return true;
} catch (IllegalStateException | IOException e) {
// TODO 需要添加日志
return false;
}
} else {
return false;
}
}
}
1.3 配置元数据格式
(1)基于java配置的元数据
//配置类
@Configuration//该注解告诉Spring该类是一个Bean,并且包含配置元数据
public class XnnBeanConfiguration{
//以下是工厂方法,这些方法在启动期间被Spring容器调用,返回值被视为Spring管理的Bean
//默认情况下,方法的名称就是Bean的名称
//在工厂方法中,首先通过调用setter方法设置所需依赖,然后使用具体类创建Bean,并将其返回。
//注,(1)依赖项也可以 以构造函数参数的形式赋予;
//(2)工厂方法的返回类型一般是接口,这样可以更容易的使用不同Bean的实现类来配置系统。
//(3)默认情况下,每个Bean作用域是单实例(singleton),即工厂方法被调用多次,返回的都是同一个实例。
@Bean
public AdService adService(){
AdServiceImpl bean= new AdServiceImpl();
bean.setAdDao(adDao());
return bean;
}
@Bean
public AdDao adDao(){
AdDaoJDBCImpl bean= new AdDaoJDBCImpl ();
return bean;
}
}
(2)XML文件
<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="adService" class="com.xnn.service.AdService">
<property name="adDao" ref="adDao"/>
</bean>
<bean id="adDao" class="com.xnn.dao.AdDao">
</bean>
(3)基于注解的配置元数据
@Service("adService")
public class AdServiceImpl implements AdService {
private AdDao adDao;
@Autowired
public void setAdDao(AdDao adDao){
this.adDao=adDao;
}
@Override
// TODO 可以改成获取失败详细原因
public boolean add(AdDao adDao) {
Ad ad = new Ad();
ad.setTitle(adDto.getTitle());
ad.setLink(adDto.getLink());
ad.setWeight(adDto.getWeight());
try {
ad.setImgFileName("");
adDao.insert(ad);
return true;
} catch (IllegalStateException | IOException e) {
// TODO 需要添加日志
return false;
}
} else {
return false;
}
}
}
@Repository("adDao")
public class AdDaoJDBCImpl implements AdDao {
@Override
public int insert(Ad ad) {
//插入数据库操作
}
}
注:Spring容器独立于配置元数据格式,可以根据需要选择其中一个,或者混合使用。
2.1 配置和使用容器
这是一种分层体系结构,每一层仅与它下面的那层进行交互,并且不知道下层Bean的具体实现。这种体系结构使得应用程序更加模块化和可测试,程序维护也变得更加容易,只修复出现问题的那层即可。
三种对应于元数据格式的创建和使用Spring容器的方式:
(1)基于java的配置,创建和使用Spring容器
1. 创建基于java的Bean定义类:XnnBeanConfiguration,即上面1.3介绍的元数据格式1;
2. 然后创建Spring容器,获得Bean,并可以使用Bean;
public class XnnTest{
@Test
public void test(){
//通过以下可以看到,Spring容器也是一个Java对象,并负责管理程序中的其他对象
//参数是Java配置元数据类
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(XnnBeanConfiguration.class);
//查找bean
//参数1:Bean名称
//参数2:类型参数,以便找到的Bean实例转换为该类型
AdService adService=applicationContext.getBean("adService",AdService.class);
//获取adService后,就可以调用其中的方法了
}
}
(2)基于XML的配置,创建和使用Spring容器
1. 创建一个XML配置文件,,即上面1.3介绍的元数据格式2;
2. 然后创建Spring容器,获得Bean,并可以使用Bean;
public class XnnTest{
@Test
public void test(){
//通过以下可以看到,Spring容器也是一个Java对象,并负责管理程序中的其他对象
//ClassPathApplicationContext 位于应用程序的类路径中,从类路径加载指定的xml文件作为构造函数参数
//参数为xml配置元数据文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
//查找bean
//参数1:Bean名称
//参数2:类型参数,以便找到的Bean实例转换为该类型
AdService adService=applicationContext.getBean("adService",AdService.class);
//获取adService后,就可以调用其中的方法了
}
}
(3)基于Java注解的配置,创建和使用Spring容器
1. 给Service层、DAO层类加注解,即上面1.3介绍的元数据格式3;
2. 创建Spring bean配置文件,添加扫描bean
<!-- 扫描service包 -->
<context:component-scan base-package="com.xnn.service" />
3. 将Spring bean配置文件作为ClassPathApplicationContext 的构造杉树参数,并实例化ClassPathApplicationContext 。
public class XnnTest{
@Test
public void test(){
//通过以下可以看到,Spring容器也是一个Java对象,并负责管理程序中的其他对象
//ClassPathApplicationContext 位于应用程序的类路径中,从类路径加载指定的xml文件作为构造函数参数
//参数为spring bean配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-beans.xml");
//查找bean
//参数1:Bean名称
//参数2:类型参数,以便找到的Bean实例转换为该类型
AdService adService=applicationContext.getBean("adService",AdService.class);
//获取adService后,就可以调用其中的方法了
}
}