Spring笔记(1)
Spring快速入门
开发步骤
导入坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
创建Bean
创建applicationContext.xml, 并加入头
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
在配置文件中进行配置,添加标签,id... class.. (执行无参构造)
<bean id = "userDao" class="Dao.Impl.UserDaoImpl"></bean>
创建applicationConetext对象
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
使用getBean获取对象,参数传入id值
bean标签的范围
默认scope取值为singleton
- 当Spring核心文件加载时,实例化配置的Bean实例
- 单例
- 销毁:销毁容器,对象被销毁
当取值为prototype时
- 当调用getBean()方法时,创建新的对象
- 多例
- 销毁:当对象长时间不适用,被java垃圾回收器回收
bean实例化的三种方法
无参构造
静态工厂
标签中添加factory-
实例工厂
配置文件
依赖注入
1.概念
浅谈IOC:https://blog.csdn.net/ivan820819/article/details/79744797
依赖关系的管理交给spring维护,在当前类需要用到其他类的对象,由spring为我们提供,只需在配置文件中说明关系的维护;
IOC的作用:降低程序之间的耦合(依赖关系)
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:
由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
IOC中最基本的技术就是“反射(Reflection)”编程
2.在service内部进行依赖注入dao
1.set方法注入
(name 值为属性,ref为容器内部的bean)
<bean id = "userService" class="Service.Impl.UserServiceImpl">
<!-- name为属性的名字, ref:注入容器id为userDao的变量-->
<property name="userDao" ref="userDao"></property>
</bean>
在service实现类中不需要使用application获取dao对象了,
可直接使用依赖注入的dao
public class UserServiceImpl implements UserService {
//成员变量
private UserDao userDao;
//使用依赖注入的dao对象
public void setUserDao(UserDao userDao){
//userDao为容器内部的注入
this.userDao = userDao;
}
@Override
public void save() {
//不需要单独获取userDao了
/*ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");*/
userDao.sava();
}
}
- 还可以p命名空间注入
2.构造方法的注入
(name为参数名,ref为id值得引用)
<bean id = "userService" class="Service.Impl.UserServiceImpl">
<!--构造方法注入-->
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
依赖注入的数据类型
普通数据类型
<bean id = "userDao" class="Dao.Impl.UserDaoImpl">
<!-- 普通数据依赖注入-->
<property name="username" value="zhangsan"/>
<property name="age" value="18"/> </bean>
引用数据类型
list集合依赖注入
map集合依赖注入
properties注入
<bean id = "userDao" class="Dao.Impl.UserDaoImpl">
<!-- 2.list集合依赖注入-->
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property> <!-- 3.map集合依赖注入-->
<property name="userMap">
<map>
<!-- 注入两条user对象-->
<entry key="user1" value-ref="user1"></entry>
<entry key="user2" value-ref="user2"></entry>
</map>
</property> <!-- 4.properties注入-->
<property name="properties">
<props>
<prop key="p1">p1</prop>
<prop key="p2">p2</prop>
<prop key="p3">p3</prop>
</props>
</property>
</bean>
分模块配置文件
在 主配置文件 中导入 模块配置文件 即可
<import resource="applicationContext-conduct.xml"/>
<import resource="applicationContext-user.xml"/>
配置数据源
1.配置pom.xml文件
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
2.配置jdbc.properties文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=gyb20010204
jdbc.url=jdbc:mysql://localhost:3306/travel
2.配置applicationContext-jdbc.xml
对DataSource进行依赖注入
<context:property-placeholder location="classpath:jdbc.properties"/>
<?xml version="1.0" encoding="UTF-8"?>
<!--此处beans标签下增加一行xmlns:context,但一般太长记不住,可以直接copy第一行的xmlns,
加一个context属性再把beans改成context-->
<!--xsi:schemaLocation下复制一遍地址,把所有beans的地方修改成context-->
<!--这样就算告诉xml我要用spring-context了-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--告诉xml,连接池的配置文件在哪-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--开始创建bean对象,类型是DruidDataSource,由于bean对象是默认调用类的无参构造函数,
所以我们要把DruidDataSource的全类名告诉bean-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--因为DruidDataSource有setDriverClassName()等此类set函数,我们就可以选择set函数来实现注入-->
<!--其中name中的内容为属性,也就是set函数中set后面的内容,并把首字母变小写,
比如setUrl(),那name就是url-->
<!--value中我们通过spEL来获取到jdbc.properties的值,spEL也就是spring expression language
类似jsp中的el-->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
</beans>
3.测试类进行测试
/**
* 测试spring注入的druid数据源
*/
@Test
public void jdbcTes t01() throws SQLException {
//获取bean
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取数据源
DataSource dataSource = app.getBean(DataSource.class);
//获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭连接
connection.close();
}
spring注解开发
开发步骤
1.在要创建的bean类上添加注解@Component("id")
如UserDaoImpl:
//<bean id = "userDao" class="Dao.Impl.UserDaoImpl">
//注解开发,创建bean
@Component("userDao")
public class UserDaoImpl implements UserDao {
...
2.在bean内类注入添加注解@Autowired****
@Qualifier("id")****
如在UserServiceImpl内注入UserDaoImpl
//<bean id = "userService" class="Service.Impl.UserServiceImpl">
//注解开发,创建serviceImplBean,引号内相当于id
@Component("userService")
public class UserServiceImpl implements UserService {
/*在service内注入dao
<property name="userDao" ref="userDao"></property>*/
@Autowired
@Qualifier("userDao")
//成员变量
private UserDao userDao;
...
3.配置组件扫描,可以扫描文件及其子包
<context:component-scan base-package="Dao"/>
<context:component-scan base-package="Service"/>
报错:** NoSuchBeanDefinitionException,**
原因: 没有进行配置组件扫描
注解说明
1.Spring原始注解(刚开始就有)主要代替Bean的配置
| 注解 | 说明 |
|---|---|
| @Component | 使用在类上用于实例化Bean |
| @Controller | 使用在web层用于实例化Bean |
| @Service | 使用在Service层用于实例化Bean |
| @Repository | 使用在DAO层用于实例化Bean |
| @Autowired | 使用在字段上根据类型依赖注入 |
| @Qualifier | 结合@Autowired一起使用根据名称进行依赖注入 |
| @Resource | 相当于@Autowired+@Qualifier,安装名称注入 |
| @Value | 注入普通属性(配置文件的变量) |
| @Scope | 标注Bean的作用范围 |
| @PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
| @PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
2.Spring新注解(出来的比原注解晚些)可以加载配置文件,第三方Bean类配置操作
| 注解 | 说明 |
|---|---|
| @Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载 |
| @ComponentScan | 用于指定Spring在初始化容器时要扫描的包作用和在Spring的xml配置文件中<context:component-scan base-package="com.cc8w"/>一样 |
| @Bean | 使用在方法上,标注该方法的返回值会存储到Spring容器中 |
| @PropertySource | 用于加载.properties文件的配置 |
| @Import | 用于导入其他配置类 |
集成Junit
步骤
导入Spring集成Junit的坐标
<!-- spring测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
使用@Runwith注解替换原来的运行期
使用@ContextConfiguration指定配置文件或配置类
使用@Autowired注入需要测试的对象
创建测试方法进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJunitTest {
@Autowired
private UserService service;
@Test
public void test1(){
service.save();
}
}
Spring笔记(1)的更多相关文章
- Spring笔记02_注解_IOC
目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...
- Spring笔记01_下载_概述_监听器
目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...
- Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)
Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...
- Spring笔记:事务管理
Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...
- Spring笔记:AOP基础
Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...
- Spring:笔记整理(1)——HelloWorld
Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- Spring笔记(6) - Spring的BeanFactoryPostProcessor探究
一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...
- spring笔记----看书笔记
上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...
- Spring 笔记(三)Bean 装配
前言 Spring 有两大核心,也就分成两份笔记分别记录. 其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring). 基于 JavaConfig 的 ...
随机推荐
- 本地项目的npm安装方法
有些node项目如一些工具类的项目,安装以后通过命令行执行其功能.但是而对于本地自建的项目如何通过npm安装,然后通过命令行(项目定义了命令行)工具执行命令调用其功能呢? 对于这种情况,笔者主要通过两 ...
- Java下如何保证多线程安全
前言 可能有人会觉得,只要我写代码的时候不去开启其他线程,那么就不会有多线程的问题了. 然而事实并非如此,如果仅仅是一些简单的测试代码,确实代码都会顺序执行而不是并发执 ...
- 什么是ETL--ETL定义、过程和工具选型思路
ETL代表"提取.转换和加载".ETL 过程在数据集成策略中起着关键作用.ETL允许企业从多个来源收集数据并将其整合到一个集中的位置.ETL还使不同类型的数据可以协同工作. 概述 ...
- 【阅读笔记】Java核心技术卷一 #6.Chapter8
8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...
- ifix与4G DTU对接实现数据显示
前言: 因公司项目需求,需要使用4G DTU设备对远端RS 485设备进行数据采集,购买了相关产品进行技术实验,成功对接ifix将数据采集并显示,将过程记录,供大家参考. 1,4G DTU基本原理和配 ...
- Android Kotlin Jetpack Compose UI框架 完全解析
前言 Q1的时候公司列了个培训计划,部分人作为讲师要上报培训课题.那时候刚从好几个Android项目里抽离出来,正好看到Jetpack发布了新玩意儿--Compose,我被它的快速实时打包给吸引住了, ...
- 揭秘阿里云 RTS SDK 是如何实现直播降低延迟和卡顿
作者:予涛 途坦 这个夏天,没什么能够比一场酣畅淋漓的奥运比赛来的过瘾.但是,在视频平台直播观看比赛也有痛点:"卡顿" 和 "延时".受限于不同地域.复杂的网络 ...
- Moco框架jar下载
下载地址: https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.10.0/ 选择如下图下载 下载成功即可使用
- Guava入门第一章(Joiner)
Guava是什么? Guava是一种基于开源的Java库,Google Guava源于2007年的"Google Collections Library".这个库是为了方便编码,并 ...
- Java中的形式参数和实际参数
一.概念 1.形式参数: 就是在定义函数或过程的时候命名的参数. 通俗讲就是一个记号. 2.实际参数: 就是在执行时,调用函数或过程时,传递给函数或过程的参数. 通俗讲就是实际值. 3.参数: 就是一 ...
