1、框架:半成品软件
高度抽取可重用代码的一种设计,高度通用性
2、Spring
容器(可管理所有组件)框架
模块划分:
核心关注:IOC AOP
核心容器:
spring-beans-4.3.18.RELEASE.jar
spring-context-4.3.18.RELEASE.jar
spring-core-4.3.18.RELEASE.jar
spring-expression-4.3.18.RELEASE.jar
IOC:(Inversion Of Control) :控制反转;
控制:资源的获取方式;
主动式:(需要什么资源都自己创建,即常规方式)
BookServlet{
BookService bs = new BookService();
AirPlane ap = new AirPlane();
}
被动式:(资源的获取不是我们自己创建,而是交给一个容器来创建和设置
BookServlet{
BookService bs ;
public void test(){
bs.cheskout();
}
}
容器:管理所有的组件(有功能的类); 主动new资源 变为被动的接受资源
DI:(Dependency Injection) 依赖注入:
容器能知道哪个组件(类)运行的时候,需要另一个组件(类),容器通过反射的 形式,将容器中准备好的对象 注入到需要该对象的另外一个当前对象中 。
————————————————————————————————————————————
HelloWorld
以前是自己 new对象 ,现在所有对象交给容器创建,给容器注册组件。
编写框架 流程
1)、导包
spring-beans-4.3.18.RELEASE.jar
spring-context-4.3.18.RELEASE.jar
spring-core-4.3.18.RELEASE.jar
spring-expression-4.3.18.RELEASE.jar
commons-logging-1.1.1.jar(Spring运行时依赖的一个日志包,没有就报错)
2)、写配置
Spring的配置文件中,集合了spring的ioc容器管理的所有组件
创建一个xml配置文件
方法一:通过bean的set()方法赋值 (使用property标签赋值)
<!== 为Person类定义一个引用id --> <bean id="person01" class="com.atguigu.bean.Person"> <!-- 使用property标签为person对象的属性赋值 --> <property name="lastName" value="zhangsan"/> <property name="age" value="18"/> <property name="email" value="zhangsan@qq.com"/> <property name="gender" value="m"/> </bean>
方法二:通过bean的构造器(即使用构造函数)为容器赋值(使用 construtor-arg)
<bean id="book" class="com.atguigu.spring.bean.Book" > <constructor-arg value= "10010"/> <constructor-arg value= "Book01"/> <constructor-arg value= "Author01"/> <constructor-arg value= "20.2"/>
3)、测试
//创建一个容器 ApplicationContext ioc = new ClassPathXmlApplicationContext("config.xml"); //获取容器中的 Person对象 Person bean =(Person) ioc.getBean("person01"); //使用 person对象 System.out.println(bean); 输出:Person{lastName='zhangsan', age=18, gender='m', email='zhangsan@qq.com'}
可以看到,代码中我们并,没有创建person类的实例对象,但是可以输出一个person的信息,这是因为容器帮我们创建了person实例 ,在config.xml配置文件中,我们已经将 一个实例配置好了,所以可以 直接使用。这就是控制反转的 概念。
(注:1、对象的创建是在容器刚被创建时创建的,而不是从 容器中获取对象时创建 )
2、同一个组件在 容器中只有一份
3、IOC容器 在创建组件对象 时,会 调用 Person类的 set方法为 java bean属性进行赋值。
bean的作用域
在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。
默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域。
当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例。而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象。