# Spring-study
**Repository Path**: amespaces/Spring-study
## Basic Information
- **Project Name**: Spring-study
- **Description**: 学习回顾Spring
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-22
- **Last Updated**: 2022-07-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
ioc容器
- ioc(Inversion of Control)控制反转
- ==使用对象时,由主动new产生对象转换为外部提供对象,此过程中对象的控制权由程序转移到外部==
- Spring技术对Ioc的实现
- ioc容器用来充当外部
- ioc容器负责对象的创建,初始化等一系列的工作,被创建或被管理的对象在Ioc容器中被统称Bean
- DI(Dependency Injection)依赖注入
- 在容器中建立Bean与Bean之间的依赖关系的整个过程(如service 与 dao)
## Bean的作用范围
- 适合交给容器进行管理的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 不适合交给容器进行管理的对象
- 封装实体的域对象
## 实例化bean
- **使用可访问的构造方法(常用)**
- 无参构造方法如果不存在,抛出异常BeanCreateionException
```xml
```
- **使用静态工厂实例化**
```xml
```
```java
import com.itheima.dao.OrderDao;
import com.itheima.dao.impl.OrderDaoImpl;
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
```
- **使用实例化工厂实例化bean**
```xml
```
```java
import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDapImpl;
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDapImpl();
}
}
```
- 使用factoryBean实例化Bean
```xml
```
```java
import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDapImpl;
import org.springframework.beans.factory.FactoryBean;
public class UserDaoFactoryBean implements FactoryBean {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDapImpl();
}
public Class> getObjectType() {
return UserDao.class;
}
public boolean isSingleton() {
return true;
}
}
```
## 配置生命周期
- 提供生命周期的方法,配置生命周期
```xml
```
- 构造器注入
- 简单类型
- 引用类型
```xml
```
## 依赖自动装配
- Ioc容器根据Bean所依赖的资源在容器中自动查找并注入到bean中的过程
- 自动装配的方式
- 按类型(常用 )
- 按名称
- 按构造方法
- 不启动自动装配
- 依赖自动装配特征
- 自动装配用于**引用类型**依赖注入,不能对简单类型进行操作
- 使用按类型装配时byType必须保障容器中相同类型的bean唯一
- 使用byName必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现会失效
## 加载properties文件
1. 开启context的命名空间
2. 使用context空间加载properties
```xml
//
```
jdbc.porperties
```
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis
jdbc.username=root
jdbc.password=root
```
```xml
不加载系统属性
加载多个properties文件
加载properties文件的=标准模式=
```
## 容器
1. 创建容器
```java
//类路径加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//文件路径加载配置文件
FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("D:\\IdeaProjects\\springstudy\\spring_10_container\\src\\main\\resources\\applicationContext.xml");
//加载多个配置文件
ApplicationContext context = ClassPathXmlApplicationContext("bean1.xml,bean2.xml");
```
2. 获取bean
```
//1.按bean名称获取
BookDao bookDao = (BookDao) context.getBean("bookDao");
//2.按bean名称获取并指定类型
BookDao bookDao= context.getBean("bookDao",bookDao.class);
//使用bean类型获取
BookDao bookDao = context.getBean(BookDao.class)
```
3. 容器类的层次结构
4. BeanFactory是Ioc容器类的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
5. 注意
- ApplicationContext接口时Spring容器的核心接口,初始化时Bean立即加载
## 注解开发bean
- 使用@Component定义bean
```xml
核心配置文件中通过组件扫描加载bean
```
- Spring提供@Component注解的三个衍生注解
- @Controller:用于表现层bean定义
- @Service:用于业务层bean定义
- @Repository用于数据层bean定义
###纯注解开发
- Spring3开启了纯注解开发的模式,使用java类代替配置文件,开启了Spring快速开发
- java类代替Spring核心配置文件
```java
@Configuration
//用于设定当前类为配置类
@ComponentScan("com.itheima")
//用于设定扫描路径,此注解只能添加一次,多个请用数组格式
public class SpringConfig {
}
```
```java
//读配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
```
- 作用范围和生命周期
```java
@Repository
@Scope("prototype")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save");
}
@PostConstruct//构造后
public void init(){
System.out.println("init");
}
@PreDestro//销毁前
public void destory(){
System.out.println("destory");
}
}
```
### 依赖注入
```java
@Configuration
@PropertySource("jdbc.properties")//加载数据源
@ComponentScan("com.itheima")
public class SpringConfig {
}
```
使用数据源后value可${}获取数据
```
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Value("${name}")
private String name;
public void save() {
System.out.println("book dao save " + name);
}
}
```
### 第三方依赖注入
- 第三方bean管理
- @Bean
```java
public class JdbcConfig {
//获得要管理的对象
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
return druidDataSource;
}
}
```
```java
@Configuration
@Import(JdbcConfig.class)//方式一导入式,如果导入多个用{}
public class SpringConfig {
}
```
```java
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource bean = context.getBean(DataSource.class);
System.out.println(bean);
```
### 注解实现为第三方bean注入资源
- 简单类型依赖注入
- 引用类型依赖注入
```java
public class JdbcConfig {
//基本类型
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/mybatis")
private String url;
@Value("root")
private String username;
@Value("root")
private String password;
//获得要管理的对象
@Bean
public DataSource dataSource(BookDao bookDao){//引用类型
System.out.println(bookDao);
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
```
## Spring整合mybatis
config
- JdbcConfig
```java
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driver);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
```
- MybatisConfig
```java
public class MybatsiConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb= new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.domain");
ssfb.setDataSource(dataSource);
return ssfb;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
```
- SpringConfig
```java
@Configuration
@ComponentScan("com.itheima")
@PropertySource("Jdbc.properties")
@Import({JdbcConfig.class,MybatsiConfig.class})
public class SpringConfig {
}
```
## Spring整合Junit
- 使用Spring整合Junit专用类加载器以及上下文配置
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
@Autowired//自动装配
private AccountService accountService;
@Test
public void test(){
System.out.println( accountService.findById(1));
// Account{id=1, name='zhangsan', money='2000'}
}
}
```
```xml
junit
junit
4.12
org.springframework
spring-test
5.2.8.RELEASE
```