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站
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了