Spring是一个开源框架,为了解决企业应用程序开发复杂性而创建的。“拿来主义”,把业界最好的技术粘合起来形成一个强大的企业级的应用框架。
Spring框架是一个分成架构,由7个定义良好的模块组成。
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
Spring模块构建在核心容器之上,核心容器定义了创建,配置和管理bean的方式!
核心容器Spring Core
核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(ioc)模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring框架两大核心:IoC和DI
IOC(inversion of Control)简单来说就是将对象Object的创建的权力及对象的生命周期的管理过程交给Spring框架来处理,从此再开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要的时候由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转。
DI(Dependency Injection)在创建对象的过程中Spring可以依据对象的关系,自动把其他对象注入(无需创建对象,直接拿来使用)尽力。
总结下Spring核心就干了两件事:
- 创建对象
- 设置对象的关联关系
package cn.tedu.ioc; import org.springframework.stereotype.Component; @Component public class Hello { public void get(){ System.out.println("hello "); } }package cn.tedu.ioc; import org.springframework.stereotype.Component; @Component//spring提供,自动完成ioc{“user”,new user() } public class User { public void get(){ System.out.println(123); } }Resources创建applicationContext.xml
<!--配置包扫描 --> <context:component-scan base-package="cn.tedu.ioc" ></context:component-scan>//测试类 package cn.tedu.test; import cn.tedu.ioc.User; import cn.tedu.ioc.Hello; import org.junit.jupiter.api.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test1 { @Test public void get(){ ClassPathXmlApplicationContext spring = new ClassPathXmlApplicationContext("Spring-config.xml"); Object hello = spring.getBean("hello"); Hello hello1 = (Hello) hello; hello1.get();//根据id获取bean //Spring就是一个大工厂(容器)专门生成bean,bean就是对象
Object user = spring.getBean("user"); User user1 = (User) user; user1.get(); } }
控制反转IoC是说创建对象的控制器进行转移,疫情创建对象的主动权和创建时机都是自己把握的,而现在将这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了Ioc容器,依赖关系就变了,原先的依赖关系就没了,他们都依赖Ioc容器了,通过IoC容器建立它们之间的关系。
自动装配
利用注解方式,我们只需要写@Autowired注解,底层就会去容器中找对应的对象,如果有获取到,反射调用其对应的set方法,设置。而这个调用过程都是自动,我们没有手工去写set方法。所以这个过程也称为自动装配。
package cn.tedu.di; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class Student { @Autowired Teacher t; String name="韩云"; @Override public String toString() { return "Student{" + "t=" + t + ", name='" + name + '\'' + '}'; } }
package cn.tedu.di; import com.sun.org.apache.bcel.internal.generic.NEW; import org.springframework.stereotype.Component; @Component public class Teacher { String name="谢佩华"; @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + '}'; } public void dd(){ System.out.println("dd"); } }
package cn.tedu.di;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.jupiter.api.Test
public void di2(){
ClassPathXmlApplicationContext spring =
new ClassPathXmlApplicationContext("Spring-config.xml");
Object student = spring.getBean("student");
System.out.println(student);
}
}