1、Spring
2、IOC:控制反转
控制:资源的获取方式
主动式:要什么资源都自己创建
BookServlet{
BookService bs = new BookService();
AirPlane ap = new AirPlane();//发杂对象的创建是比较庞大的工程
}
被动式:获取的资源不是自己创建,而是交给一个容器进行创建和设置
BookServlet{
BookService bs;
Public void test01(){
bs.checkout();
}
}
容器:负责管理所有的组件(有功能的类);假设BookServlet受容器管理,BookService也受容器管理;容器可以自动查到那些组件需要用到另一个组件,容器帮助我们创建BookService对象,并把BookService对象赋值过去。
容器:主动的new资源变为被动的接受资源。
(容器)==婚介所;主动获取===》被动接受
DI:依赖注入,容器能知道哪个组件运行的时候,需要另一个类;容器通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中;
只要IOC容器管理的组件,都能使用容器提供的强大功能。
3、实验:
HelloWorld:通过各种方式给容器中注册对象(注册会员)
以前是自己new一个新的对象,现在将所有的对象创建交给容器进行创建,给容器注册组件
实验步骤:
(1)导包
(1)核心容器
spring-beans-4.1.6.RELEASE.jar
spring-context-4.1.6.RELEASE.jar
spring-core-4.1.6.RELEASE.jar
spring-expression-4.1.6.RELEASE.jar
(2)日志包
commons-logging-1.1.3.jar
(2)写配置
Person.java文件
/**
*
*/
package com.jc.bean;
/**
* @author JC.Liu
*
* 2019年10月9日-下午9:18:16
*/
public class Person {
private String name;
private Integer age;
private String gender;
private String email;
public Person() {
System.out.print("创建了");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", email=" + email + "]";
}
}
ioc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注册一个Person对象,Spring会自动创建这个Person对象 -->
<!--
一个bean可以注册一个组件(对象、类)
class:写要注册组件的类名
id:这个对象的唯一标识
-->
<bean id="person01" class="com.jc.bean.Person">
<!--
使用property标签为Person对象的属性值
name="name",指定属性名
value="文波",为这个属性进行赋值
-->
<property name="name" value="文波"></property>
<property name="age" value="16"></property>
<property name="gender" value="成都"></property>
<property name="email" value="[email protected]"></property>
</bean>
</beans>
(3)测试
Test.java测试文件
package com.jc.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jc.bean.Person;
/**
* @author JC.Liu
*
* 2019年10月9日-下午9:28:41
*
* 1、src:源码包开始的路径,成为类路径的开始
* 所有的源码包内的东西都会被合并放在类路径下
* java: /bin/
* web: /WEB-INF/classes/
* 2、导包commons-logging-1.1.3.jar(依赖包)
* 3、先导包才创建配置文件
* 4、Spring的容器接管了标志了s的类
*/
/*
* 注意细节:
* 1、ApplicationContext(IOC容器的接口)
* 2、给容器注册一个组件,我们也从容器中按照id拿到了这个组件的对象?
* 组件的创建工作,是容器完成的
* Person对象是什么时候创建好的
* 容器中对象的创建完成的时候就已经创建好了
* 3、同一组件在Ioc容器中是单实例的,容器启动完后才能都已经创建准备好了
* 4、容器如果没有这个组件会报异常
* 5、javaBean的属性名是由什么决定的?
* getter/setter方法是属性名,set去掉后面那一串首字母
* 所有的都是自动生成
* */
public class SpringTest {
//从容器中拿到这个组件
@Test
public void test() {
//ApplicationContext代表IOC容器
//ClassPathXmlApplicationContext():当前应用的xml配置文件在ClassPath下
//根据spring的配置文件得到ioc容器对象
ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
System.out.println("容器启动完成");
//容器帮我们创建对象
Person bean=(Person) ioc.getBean("person01");
System.out.println(bean);
}
}
测试结果: