目录
2、使用 Spring IOC 实现业务层和数据访问层解耦合
1、使用 Spring IOC 实现业务层与数据层解耦合
1、初识Spring
1、Spring 框架
2、Spring 框架的体系结构
Spring框架大约有20个功能模块组成。这些模块被分成6个部分,分别是Container、Data Access/Integration、Web、AOP(Aspect Oriented Programing)、Instrumentation及Test。
2、Spring IOC
1、理解控制反转
如上代码两个类之间存在依赖关系。这样的代码很常见,但是存在要一个严重的问题,即代码高度耦合,程序不具备优良的可扩展性和可维护性,甚至在开发中难以测试。
改进:利用简单工厂类和工厂方法实现业务层和数据访问层的解耦合。
2、使用 Spring IOC 实现业务层和数据访问层解耦合
下面通过一个示例讲解如何使用Spring IOC实现业务层和数据访问层的解耦合。
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("classpath:springIOC.xml");
Student s1=app.getBean(Student.class);
//当IOC容器里有同类型的Bean对象时,可以明确指出需要哪个id的Bean
Student s2=(Student) app.getBean("s1");
System.out.println(s1);
System.out.println(s2);
}
2、掌握不同类型参数的注入方法和Bean的作用域设置
1、实现不同类型的参数注入
1、注入直接量(基本数据类型、字符串)
1、使用< ! [CDATA [ ] ] >标记处理XML特殊字符
2、把XML特殊字符替换为实体引用
2、引用其他Bean组件
3、使用内部Bean
4、注入集合类型的属性
1、对于List或数组类型的属性,可以使用<list>标签注入。
<list>标签可以使用<value>、<ref>标签注入集合元素,甚至是另一个list标签。
2、对于set类型的属性,可以使用<set>标签注入
<set>标签也可以使用<value>、<ref>标签注入集合元素。
3、对于map类型的属性,可以使用如下方式注入
如果map中的键或值是bean对象,可以把上面代码中的<value>换成<ref>。
4、对于Properties类型的属性,可以使用如下方式注入
5、注入null 和空字符串值
2、设置bean的作用域
对于不同类型的参数注入,重点应掌握基本数据类型及其包装类、字符串及Bean类型的注入方法。
对于Bean的作用域设置,需要结合线程安全方面的知识,在应用中不断体会,做到正确选择。
3、使用多种方法简化 Spring IOC 的配置
1、使用P命名空间注入Bean的属性
Spring配置文件从2.0版本开始使用schema形式,使用不同的命名空间管理不同类型的配置,使得配置文件更具扩展性。此外,Spring基于schema的配置方案为许多领域的问题提供了简化的配置方法,大大简化了配置的工作量。
P命名空间的特点是使用属性而不是子元素的形式配置Bean的属性,从而简化了Bean的配置。
使用传统的<property>子元素配置的代码如下:
使用 P命名空间改进配置,注意使用前要先添加p命名空间的声明。
2、在Spring配置文件中实现自动装配
3、使用注解实现Bean的定义
除了XML形式的配置文件,Spring从2.0版本开始引入注解的配置方式,将Bean的定义信息和Bean实现类结合在一起。
实现步骤:
①在Bean实现类中添加注解
②使用注解的配置信息启动Spring容器
推荐使用特定的注解标注特定的实现类。
以上代码中,
首先添加context命名空间的声明,然后使用context命名空间的component-scan扫描注解标注的类。
base-package属性指定了一个需要扫描的基准包,Spring会扫描这个包里所有的类,获取Bean的定义信息。
4、使用注解实现自动装配
Spring提供了@Autowired注解实现Bean的自动装配。关键代码如下:
@Service("ssi")
public class StudentServiceImpl implements StudentService {
// required=false:
// 默认情况下,值为true,使用了@Autowired的属性必须赋值(IOC容器里面必有有一个)
// 如果为false,IOC容器内有对象则注入,没有不用管
@Autowired(required = false)
// 明确指定需要注入那个id的bean
@Qualifier("studentDao")
private StudentDao sd;
@Override
public int addStudent(Student stu) {
return sd.addStudent(stu);
}
@Override
public int deleteStudent(int id) {
System.out.println(sd.getName());
return sd.deleteStudent(id);
}
}
5、使用注解指定Bean的作用域