Spring -IOC
一 . Spring 框架结构
Spring 是一个Ioc 和 AOP 容器的框架
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7fqcuVR-1595508246596)(D:\java课程\yangchx\网课\课程资料\Spring\常见异常\Spring结构图.png)]
-
底层
- core : 封装了架构需要的最底层部分,包括类型转换,资源访问等常用工具类
- beans : 提供了控制反转和依赖注入,
- context
- ELsp
-
aop aspects
- 提供了面向切面编程原理,
-
web 提供了web功能
-
数据库层 : 提供对数据库操作的模块
二 . IOC (控制反转) . DI (依赖注入)
-
Spring 的核心容器, 通过控制反转,对所有对象进行创建,管理,通过依赖注入对对象进行配置,并且管理对象生命周期
-
xml 配置 ioc
- bean 标签 : 一个bean标签代表注入对象
- id 属性 : 配置bean对象的id
- class 属性 : 配置对象类的全类名, ( 用于反射创建对象)
- name 属性 : 创建对象的别名, 可以通过改名字得到对象
- scope 属性 : 定义bean的作用范围
- singleton:设定创建出的对象保存在spring容器中,是一个单例的对象
- prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
- request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
- init-method,destroy-method : 定义该对象创建和结束时需要执行的任务
- property 标签: 使用set方法的形式为bean提供资源
- name : 字段名
- value / ref 属性值
- constructor-arg 标签 : 使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作
- name:对应bean中的构造方法所携带的参数名
- value:设定非引用类型构造方法参数对应的值,不能与ref同时使用
// xml 整合mybatis <!--加载perperties配置文件的信息--> <context:property-placeholder location="classpath:*.properties"/> <!--加载druid资源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--加载SqlSession工厂bean--> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!--引入DataSource--> <property name="dataSource" ref="dataSource"/> <!--引入别名--> <property name="typeAliasesPackage" value="com.itheima.domain"/> </bean> <!--加载业务层实现类对象--> <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> <!--注入参数--> <property name="accountDao" ref="accountDao"/> </bean> <!--配置存放动态代理对象的容器--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置扫描到哪个包--> <property name="basePackage" value="com.itheima.dao"/> </bean>
- bean 标签 : 一个bean标签代表注入对象
-
注解配置
- @Configurable : 作用在注解类上, 标示该类是Spring 主配置类 作用在配置类上
- @ComponentScan(“包名”) : Spring 需要扫描的包 作用在配置类上
- @PropertiesResource (“资源文件”) : 加载外部配置文件 作用在配置类上
- @Import (.class) 注入其他配置类 {mybatis.class …} 作用在配置类上
- @Component (@Service – 业务层 @controller–表现层 @Resposiory – 数据层 )作用在类上 标记该类,扫描到该类时, 其实例将会被注入到Ioc容器中.
- @Bean : 作用在方法上, 方法返回值作为该bean注入到容器中 用于加载第三方资源
- @Value(默认属性:定义bean的id) : 注入非引用类型属性
- value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
- value值支持读取properties文件中的属性值,通过类属性将properties中数据传入类中
- value值支持SpEL
- @value注解如果添加在属性上方,可以省略set方法(set方法的目的是为属性赋值)
- @PostConstruct、@PreDestroy 设置该类作为bean对应的生命周期方法 定义在方法上
- @Autowired、@Qualifier 注入引用类型的属性 ,
- @Autowired默认按类型装配,指定@Qualifier后可以指定自动装配的bean的id
- @Primary 指定bean装配的优先级 . 作用在类上, @Resource是JSR250规范中的注解,可以简化书写格式
- @Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级,多个@Primary 会导致优先级设置无效
/**
* JDBC 配置类, 用来连接JDBC(像Ioc容器中注入DataSource bean)
*/
public class JDBCConfig {
// 定义加载JDBC的四个核心参数
@Value("${jdbc.driver}")
private String className;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String userName;
@Value("${jdbc.password}")
private String passWord;
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(className);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(passWord);
return ds;
}
}
public class MybatisConfig {
@Autowired
private DataSource dataSource;
// 注入SqlSessionFactory bean
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
SqlSessionFactoryBean sfb = new SqlSessionFactoryBean();
sfb.setDataSource(dataSource);
sfb.setTypeAliasesPackage("com.itheima.domain");
return sfb;
}
// 注入存储动态代理对象的bean
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima");
return msc;
}
}
/**
* Spring 主配置类
* */
@Configurable // 标记该类是Spring主配置类.
@ComponentScan("com.itheima") // 标记Spring扫描的包的范围
@PropertySource("classpath:jdbc.properties") // 引入配置文件
@Import({JDBCConfig.class,MybatisConfig.class}) // 引入其他配置类
public class SpringConfig {
}
// 业务层接口
@Component("aaa")
public class AccountServiceImpl1 implements AccountService1 {
@Autowired
private AccountDao1 accountDao;
// 数据层接口
@Component
public interface AccountDao1 {
void save(Account account);
void delete(Integer id);
void update(Account account);
@Select("select * from account")
List<Account> findAll();
Account findById(Integer id);
}
// 测试类
public class App {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService1 aaa = (AccountService1) ac.getBean("aaa");
List<Account> all = aaa.findAll();
System.out.println(all);
}
}
三 . 依赖加载应用场景
-
@DependsOn 微信订阅号,发布消息和订阅消息的bean的加载顺序控制 ◆
-
双11活动期间,零点前是结算策略A,零点后是结算策略B,策略B操作的数据为促销数据。策略B 加载顺序与促销数据的加载顺序
-
@Lazy ◆程序灾难出现后对应的应急预案处理是启动容器时加载时机
-
@Order ◆多个种类的配置出现后,优先加载系统级的,然后加载业务级的,避免细粒度的加载控制
-
应用程序运行依赖的资源由Spring为其提供,资源进入应用 程序的方式称为注入
◆
-
双11活动期间,零点前是结算策略A,零点后是结算策略B,策略B操作的数据为促销数据。策略B 加载顺序与促销数据的加载顺序
-
@Lazy ◆程序灾难出现后对应的应急预案处理是启动容器时加载时机
-
@Order ◆多个种类的配置出现后,优先加载系统级的,然后加载业务级的,避免细粒度的加载控制
-
应用程序运行依赖的资源由Spring为其提供,资源进入应用 程序的方式称为注入