Spring 被称为 J2EE 的春天,是一个开源的轻量级的 Java 开发框架, 具有控制反转(IOC)和面向切面(AOP)两大核心。Java Spring 框架通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
2.1IOC(DI) - 控制反转(依赖注入)
所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由Spring框架提供,这个由spring框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过称之为依赖注入,也即DI。
IOC(Inversion of Control):控制反转
DI(Dependency Injection):依赖注入
IOC是一种思想,而DI是实现IOC的主要技术途径。
DI主要有两种注入方式,及Setter注入和构造器注入。
2.2IOC入门案例
a.创建一个java项目
spring并不是非要在javaweb环境下才可以使用,一个普通的java程序中也可以使用Spring。
b.导入Spring的lib目录下引入IOC相关的jar包
6个spring相关的包,一个其他包( commons-logging)
Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。
将jar包Add as Library
idea是两级管理:在 模块下,可以有项目(一般开发选择Project Library)练习中则导入Module Library(给demo单独导包)
c.创建Spring的配置文件
Spring采用xml文件作为配置文件,xml文件名字任意,但通常都取名为applicationContext.xml,通常将该文件放置在类加载的目录里下(src目录),方便后续使用。
spring配置文件模板
d.创建bean类,并在spring中进行配置交由spring来管理
public class Person {
public void eat(){
System.out.println("eating...");
}
}
e.在程序中通过Spring容器获取对象并使用
package cn.ww.test;
import cn.ww.beans.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 测试类
*/
public class DemoTest {
/**
* 传统的通过创建对象调用方法
*/
@Test
public void test01(){
//1.创建对象
Person p = new Person();
//2.调用方法
p.eat();
}
/**
* 通过spring获取对象并调用方法
*/
@Test
public void test02(){
//1.初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过spring容器获取bean,getBean中的person 为applicationContext 配置文件中的 bean的id
Person p = (Person) context.getBean("person");
//3.调用方法
p.eat();
//4.关闭spring容器
((ClassPathXmlApplicationContext)context).close();
}
}
测试通过spring获取对象并调用对象方法成功
在初始化一个Spring容器时,Spring会去解析指定的xml文件,当解析到其中的
由此可以推测而知:
通过context.getBean()方法获取bean时,可以通过如下两种方式获取:
通过class方式获取bean时,如果同一个类配置过多个bean,则在获取时因为无法确定到底要获取哪个bean会抛出异常。
而id是唯一的,不存在这样的问题,所以建议大家尽量使用id获取bean。
/**
* 获取对象的方式
* 通过id获取bean
* 如果找不到,抛异常NoSuchBeanDefinitionException
* 如果找到唯一的,返回对象
* 因为id不重复,不可能找到多个
* 通过class获取bean
* 如果找不到,抛出异常NoSuchBeanDefinitionException
* 如果找到唯一,返回对象
* 如果找到多个,抛出异常NoUniqueBeanDefinitionException
*/
@Test
public void test04(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取对象方式1:通过id获取
//Person p = (Person)context.getBean("person");
//p.eat();
//p.say();
//获取对象方式2:通过class获取
Person p = context.getBean(Person.class);
p.eat();
p.say();
((ClassPathXmlApplicationContext)context).close();
}
SpringIOC在通过class获取bean时,如果找不到该类型的bean还会去检查是否存在该类型的子孙类型的bean,如果有则返回,如果找不到或找到多个则抛出异常。这符合java面向对象思想中的多态的特性。
@Test
public void test02() {
//1.初始化spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取Bean
JavaTeacher jt = (JavaTeacher) context.getBean(Teacher.class);
System.out.println(jt);
}
在 Spring中提供了别名标签
格式:
如下图,在applicationContext配置文件中配置person的别名为pre
在获取bean时可以直接通过别名来获取
测试结果正常