【Spring】深入理解控制反转-IOC
目录
一、Spring_ioc_01项目
1. jdbc.properties
2. 高耦合
3. 中耦合
4. 低耦合
二、Spring_ioc_02项目
1. xxx.properties(键值对存储)
2. 解耦的方式创建对象
3. 调用getBean()方法并传入xxx.properties对应键获取其相应的值
三、Spring_ioc_03项目
1. spring两大思想:
1.1 IOC控制反转 、DI依赖注入
1.2 AOP面向切面编程
2. spring环境搭建
4. SpringIOC的理解
四、Spring_ioc04
1. SpringDI(依赖注入)
2. DI实现方式
2.1 set注入
2.2 构造注入
2.3 注解注入
3. DI数据类型
4. DI使用步骤
五、Spring_ioc_05_bean
1. SpringIOC容器对Bean管理
2. bean作用域
3. bean生命周期
六、Spring_ioc_06_ann
1. spring的配置
2. spring2.5后=xml+annotation
3. 注解
3.1 注入类
3.2 注入基本数据
3.3 其他注解
七、Spring_ioc_07_javaConfig
1. 3.0配置类语法:
八、模块Module:项目同级显示
在软件开发中,控制层(Controller)、业务逻辑层(Service)、数据访问层(DAO)三层架构是一种广泛采用的设计模式。
一、Spring_ioc_01项目
1. jdbc.properties
2. 高耦合
3. 中耦合
4. 低耦合
二、Spring_ioc_02项目
1. xxx.properties(键值对存储)
2. 解耦的方式创建对象
new Properties()创建了一个Properties对象。Properties类继承自Hashtable<Object,Object>,用于处理键值对形式的属性文件(如.properties文件),其中键和值都是字符串类型。
Test01.class.getClassLoader()获取了当前类(Test01)的类加载器,然后调用getResourceAsStream方法加载位于类路径(classpath)下的xxx.properties文件。之后,通过properties.load(inputStream)将文件内容加载到Properties对象中。
properties.getProperty(key)方法,根据传入的key(字符串)从Properties对象中获取对应的值(即类名)。
newInstance()方法创建这个类的一个新实例(new 对象)。
3. 调用getBean()方法并传入xxx.properties对应键获取其相应的值
三、Spring_ioc_03项目
1. spring两大思想:
1.1 IOC控制反转 、DI依赖注入
1)IOC容器:
springIOC搭建spring容器管理程序中的各个组件(class类)让程序可以实现高内聚,低耦合的编程。
2)SpringIOC(控制反转):解耦
3)硬编码实现解耦:
(1)不要直接new对象,通过反射创建
(2)将需要创建的对象独立保存在资源文件中,动态加载
1.2 AOP面向切面编程
2. spring环境搭建
2.1.坐标 pom.xml
2.2.配置文件 beans.xml
3. springIOC:
3.1.找到需要以解耦方式获取实例对象的类
3.2.将需要spring管理的类注入spring容器(beans.xml)
<bean id="唯一标识" class="类"></bean>
3.3.向spring容器中索取java实例(解耦)
(1)相对路径加载spring核心配置文件,获取spring容器对象
(2)获取对象
4. SpringIOC的理解
● IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系
● IOC( Inversion of Control,中文释义:控制反转 ) 是Spring框架的核心思想之一,主要用于解耦。IOC是指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;
○ 控制 :指的是对象创建(实例化、管理)的权力
○ 反转 :控制权交给外部环境(Spring框架、IoC容器)
关键字:
BeanFactory(父)
ApplicationContext(子)
ClassPathXmlApplicationContext:通过加载主配置文件的相对路径,获取spring容器
FileSystemXmlApplicationContext:通过加载主配置文件的绝对路径,获取spring容器
AnnotationConfigApplicationContext:加载配置类,获取spring容器
四、Spring_ioc04
1. SpringDI(依赖注入)
作用:将springioc容器所创建的各个组件,使用DI的语法进行关联,耦合(胶水)
2. DI实现方式
2.1 set注入
语法:<property name value ref(引用)>
JavaBean(注入对象):
(1)set方法
(2)set配置(applicationContext.xml)
基本数据类型与String:
(1)set方法
(2)set设置
复杂数据类型:
(1)set方法
(2)set设置
2.2 构造注入
语法:<constructor-arg name type index value ref>
基本类型与String
(1)构造方法 (无参构造方法不能忘)
(2)构造配置
JavaBean
(1)构造方法
(2)构造配置
2.3 注解注入
3. DI数据类型
(1)基本类型与String
(2)JavaBean
(3)复杂类型,list set array map properties(构造注入不支持)
4. DI使用步骤
1.思考,什么方式,什么数据类型
2.给属性提供set(构造)方法
3.编写配置文件
五、Spring_ioc_05_bean
1. SpringIOC容器对Bean管理
1)bean实例化
(1)通过构造方法(默认)
(2)通过工厂方法
(3)通过静态工厂方法
2. bean作用域
含义:spring对于创建javaBean实例的方式
语法:<bean scope="属性值"></bean>
属性值:
singleton=====>单例(默认)
prototype=====>多例
request=======>一个请求创建一个
session=======>一个会话创建一个
3. bean生命周期
1)实例化 ===> 构造方法、工厂
2)属性赋值(DI) ===> set、构造
3)初始化
(1)接口 InitializingBean ===> afterPropertiesSet()方法
(2)属性 init-method=""
4)操作使用
5)销毁了
容器关闭执行销毁(classPathXmlApplicationContext.close())
(1)接口 DisposableBean ===> destroy()方法
(2)属性 destory-method=""
六、Spring_ioc_06_ann
1. spring的配置
- spring2.5前==xml
- spring2.5后==xml+annotation
- spring3.0后==annotation+JavaConfig配置类
2. spring2.5后=xml+annotation
目的优化一下代码:
<bean id="" class="" init-method="" destroy-method="" scope="" autowire="">
<property></property>
<constructor-arg></constructor-arg>
</bean>
3. 注解
3.1 注入类
(1)替换:<bean id="" class=""></bean>
(2)位置:类
(3)语法: @Component
eg:Class User{}
<bean id="user" class="com.apesource.包.User"></bean>
||等价于||
@Component
Class User{}
@Component(value="注入容器中的id,如果省略id为类名且首字母小写,value属性名称可以省略")
(4)配置:
<context:component-scan base-package=""></context:component-scan>功能一致
(5)含义:扫描所有被@Component注解所修饰的类,注入容器
(6)@Repository=====>注入数据访问层
@Service========>注入业务层
@Controller=====>注入控制层
以上三个注解与@Component功能语法一致
3.2 注入基本数据
(1)@Value
含义:注入基本数据
替换:<property></property>
修饰:成员变量或对应的set方法
语法:@Value("数据内容")
@Value("${动态获取}")===>el表达式
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
(2)@Autowired
语法:
@Autowired(required = "true-默认、false、是否必须进行装配")
@Autowired(required = true)===>找不到对应类型会报错
@Autowired(required = false)===>找不到不进行装配,且不会报错
修饰:成员变量或对应的构造方法
含义:按照通过set方法进行“类型装配”,set方法可以省略
注意:
默认是按照类型装配且同set方法。
若容器中有一个类型可以与之匹配则装配成功,若没有一个类型可以匹配则报错。(NoSuchBeanDefinitionException)
若容器中有多个类型可以与之匹配,则自动切换为按照名称装配,若名称没有对应,则报错(NoUniqueBeanDefinitionException)
3.3 其他注解
(1)@Primary
含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)
修饰:类
注意:不能单独使用,必须与@Component....联合使用
(2)@Qualifier(value="名称(类第一个字母小写)")
含义:按照名称装配
修饰:成员变量
注意:不能单独使用,必须与@Autowired联合使用
(3)@Resource(name="名称(类第一个字母小写)")
含义:按照名称装配
修饰:成员变量
注意:单独使用
(4)@Scope
含义:配置类的作用域
修饰:类
注意:不能单独使用,必须与@Component....联合使用
@Scope("prototype")
@Scope("singleton")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
(5)@PostConstruct:初始化,修饰方法
替换:init-method
(6)@PreDestroy:销毁,修饰方法
替换:destory-method
七、Spring_ioc_07_javaConfig
1. 3.0配置类语法:
spring中的新注解
(1)@Configuration
作用:指定当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
(2)@ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
替换:
(3)@PropertySource
作用:用于指定properties文件的位置
属性:value:指定文件的名称和路径。
配合@Value使用
替换:
(4)@Bean
作用:用于把当前方法的返回值作为bean对象存入spring的容器中
属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称
(5)@Import
作用:用于导入其他的配置类
属性:value:用于指定其他配置类的字节码。
例子:@Import(SystemSpringConfig.class)
八、模块Module:项目同级显示
parent:父项目
Grouid:与项目中java路径一致