java框架——Spring
核心概念
-
代码书写现状
- 耦合度偏高
-
解决方案
- 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
-
IoC(Inversion of Control)控制反转
- 对象的创建控制权由程序转移到外部,这种思想称为控制反转
Ioc(Inversion of Control)控制反转
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
Spring技术对IoC思想进行了实现
-
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的“外部”
-
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
DI(Dependency Injection)依赖注入
- 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
目标:充分解耦
-
使用IoC容器管理bean(IoC)
-
在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果
- 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
依赖注入方式
思考:向一个类中传递数据的方式有几种?
-
普通方法(set方法)
-
构造方法
思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或者字符串呢?
-
引用类型
-
简单类型(基本数据类型与String)
依赖注入方式
-
setter注入
-
简单类型
-
引用类型
-
-
构造器注入
- 简单类型
- 引用类型
依赖自动装配
配置中使用bean标签autowire属性设置自动装配的类型
<bean id="bookDao" class="com.example.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.example.service.impl.BookServiceImpl" autowire="byType"/>
依赖自动装配特征
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级地狱setter注入与构造器注入,同时出现时自动装配配置失效
数据源对象管理
加载properties文件
不加载系统属性
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
加载多个properties文件
<context:property-placeholder location="*.properties"/>
加载所有properties文件
<context:property-placeholder location="*.properties"/>
加载properties文件标准格式
<context:property-placeholder location="classpath:*.properties"/>
从类路径或jar包中搜索并加载properties文件
<context:property-placeholder location="classpath*:*.properties"/>
注解开发定义Bean
使用@Component定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao{
}
@Component
public class BookServiceImpl implements BookService{
}
核心配置文件中通过组件扫描加载bean
<context:component-scan base-package="com.example"/>
Spring提供@Component注解的三个衍生注解
-
@Controller:用于表现层bean定义
-
@Service:用于业务层bean定义
-
@Repository:用于数据层bean定义
@Repository("bookDao")
public class BookDaoImpl implements BookDao{
}
@Service
public class BookServiceImpl implements BookService{
}
纯注解开发
Spring3.0开启了纯注解开发模式,使用Java类代替配置文件,开启了Spring快速开发赛道
Java类代替Spring核心配置文件
@Configuretion
@Component("com.example")
public class SpringConfig{
}
@Configuration注解用于设定当前类为配置类
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({"com.example.service","com.example.dao"})
小结
- 定义bean
-
@Component
-
@Controller
-
@Service
-
@Repository
-
-
<context:component-scan/>
- 纯注解开发
-
@Configuration
-
@ComponentScan
-
AnnotationConfigApplicationContext
bean作用范围
使用@Scope定义bean作用范围
@Repository
@Scope("singleton")
public classBookDaoImpl implements BookDao{
}
bean生命周期
使用@PostConstructor、@PreDestroy定义bean生命周期
@Repostory
@Scope("single")
public class BookDaoImpl implements BookDao{
public BookDaoImpl(){
System.out.println("book dao constructor ...");
}
@PostConstruct
public void init(){
System.out.println("book init");
}
@PreDestroy
public void destroy(){
System.out.println("book destory ...");
}
}
依赖注入
使用@Autowired注解开启自动装配模式(按类型)
@Service
public class BookServiceImpl implements BookService{
@Autowired
private BookDao bookDao;
// public void setBookDao(BookDao bookDao){
// this.bookDao = bookDao;
// }
public void save(){
System.out.println("book service save ...");
bookDao.save();
}
}
使用@Qualifier注解开启指定名称装配bean
@Service
public class BookServiceImpl implements BookService{
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
使用@Value实现简单类型注入
@repository("bookDao")
public class BookDaoImpl implements BookDao{
@Value("100")
private String connectionNum; // ???这么鸡掰写法,我人傻了,为啥要这么写直接等号赋值不好吗!?
}
加载properties文件
- 使用@PropertySource注解加载properties文件
@Configuration
@ComponentScan("com.example")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig{
}
第三方Bean管理
使用@Bean配置第三方bean
@Configuration
public class SpringConfig{
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test01");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
}
将独立的配置类加入核心配置
- 方式一:导入式
public class JdbcConfig{
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
// 相关配置
return ds;
}
}
使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
@Configuration
@Import(JdbcConfig.class)
public class SpringConfig{
}
- 方式二:扫描式(不推荐)
@Configuration
public class JdbcConfig{
@Bean
public DataSource dataSrouce(){
DruidDataSource ds = new DruidDataSource();
return ds;
}
}
- 使用@ComponentScan注解扫描配置类所在的包,加载对应的配置信息
@Configuration
@ComponentScan({"com.example.config"})
public class SpringConfig{
}
第三方bean依赖注入
引用类型依赖注入
@Bean
public DataSource dataSource(BookService bookService){
System.out.println(bookService);
DruidDataSource ds = new DruidDataSource();
// 属性设置
return ds;
}
引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
本文来自博客园,作者:maplerain,转载请注明原文链接:https://www.cnblogs.com/maplerain/p/16750637.html 博主B站