Spring特点
SpringFrame
1.ioc
2.aop
3.事务处理
Spring有很多优良特性
非侵入式
依赖注入
面向切面编程
容器
组件化
一站式
组件和容器
组件:具有一定功能的对象
容器:管理组件(创建,获取,保存,销毁)
一个常见的容器:
组件Servlet
容器Servlet
IOC 和 DI
Ioc控制反转
控制:资源的控制权
反转:和传统的方式不一样
DI 依赖注入(通过反射赋值)
依赖:组建的依赖关系,如NewsController依赖NewsServices
注入:通过setter方法,构造器,等方式自动注入
通过依赖注入实现的控制反转IOC
容器-注册
实验一 把组件放到容器
package com.huawei.springday01ioc.Bean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
/**
*这个是主入口类
*
*/
@SpringBootApplication
public class SpringDay01IocApplication {
//跑起来一个Spring应用 ApplicationContext: Spring应用上下文对象:IOC容器
public static void main(String[] args) {
ConfigurableApplicationContext context= SpringApplication.run(SpringDay01IocApplication.class, args);
String[] names = context.getBeanDefinitionNames();
for(String name:names){
System.out.println(name);
}
}
@Bean
public Person person(){
Person person =new Person();
person.setAge(18);
person.setName("张三");
person.setGender("男");
return person;
}
实验二 获取容器中的组件的名字 类型 作用域
@Bean("name")
//总结
//1.组件不存在抛异常
//2.组件不唯一
//3.组件唯一,正常运行
//4.1根据名字获取Bean
Object hahaha = context.getBean("hahaha");
System.out.println(hahaha);
//4.2根据类型获取Bean
Person bean = context.getBean(Person.class);
System.out.println(bean);
//4.3根据组件类型获取这种类型的所有对象
Map<String, Person> beansOfType = context.getBeansOfType(Person.class);
System.out.println(beansOfType);
}
创建时机:容器启动过程中会创建组件对象
组件是单实例的
实验三 @Configuration注解
组件:框架的底层配置 配置文件 配置类(也是容器中的组件)
实验四--实验七 @Controller @Service @Repository @Component
实验八 @ComponentScan 批零扫描
分层注解能起作用的前提,这些组件必须在主程序所在的包及其子包的结构下
@ComponentScan(Pac)
二、为什么需要 @ComponentScan?
在没有 @ComponentScan 的情况下,Spring 不知道去哪里找 Bean:
java
// 没有 @ComponentScan,这个类不会被发现
@Repository // 注解写了也没用,Spring 找不到
public class UserRepository {
// ...
}
结论:只有被 @ComponentScan 扫描到的包下的注解类,才会被注册到容器中。
实验9 @Import注解 导入第三方组件
第三方组件导入两种方式
@Bean自己new,注册给容器
@import(xxxx) 最好写在配置类里
实验10 @Scope注解 调整组件作用域
实验11 @Lazy懒加载
//容器启动之前不会获取Bean对象 什么时候加载 什么时候获取
FactoryBean
用于创建比较复杂的对象 @Component
package com.huawei.springday01ioc.factory;
import com.huawei.springday01ioc.Bean.Car;
import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class BYDfactory implements FactoryBean<Car> {
@Override
public @Nullable Car getObject() throws Exception {
Car car =new Car();
return car;
}
@Override
public @Nullable Class<?> getObjectType() {
return Car.class;
}
/**
* 重写父类或接口中的isSingleton方法
* 该方法用于判断当前Bean是否为单例模式
* @return 返回boolean类型值,true表示当前Bean为单例模式,false表示非单例模式
*/
@Override
public boolean isSingleton() {
// 返回true,表示当前Bean是单例模式
// 在Spring框架中,单例模式表示整个容器中只存在一个该Bean的实例
return true;
}
}
实验十二 @Conditionnal条件注册
容器--注入
实验一 @Autowired注解
@Autowired
原理:spring调用getBean方法
自动装配流程:按照类型找到这个组件,有且找到一个,直接返回
如果找到多个,再按照名称去找
实验二 @Qualifer @Primary
实验四 @Resource
@Resource具有更强的通用性
实验六 构造器注入
package com.huawei.springday01ioc.dao;
import com.huawei.springday01ioc.Bean.Dog;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@ToString
@Repository
public class UserDao {
Dog dog;
@Autowired
public UserDao (Dog dog){
/**
*构造器注入
* /**
* 依赖注入
*/
this.dog=dog;
}
public UserDao (){
this.dog=null;
}
}