Spring快速入门

开发步骤

  1. 导入坐标

    1. <dependency>
    2. <groupId>org.springframework</groupId>
    3. <artifactId>spring-context</artifactId>
    4. <version>5.0.5.RELEASE</version>
    5. </dependency>
  2. 创建Bean

  3. 创建applicationContext.xml, 并加入头

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans.xsd">
    6. </beans>

    在配置文件中进行配置,添加标签,id... class.. (执行无参构造)

    1. <bean id = "userDao" class="Dao.Impl.UserDaoImpl"></bean>
  4. 创建applicationConetext对象

    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

  5. 使用getBean获取对象,参数传入id值

bean标签的范围

默认scope取值为singleton

  • 当Spring核心文件加载时,实例化配置的Bean实例
  • 单例
  • 销毁:销毁容器,对象被销毁

当取值为prototype时

  • 当调用getBean()方法时,创建新的对象
  • 多例
  • 销毁:当对象长时间不适用,被java垃圾回收器回收

bean实例化的三种方法

  1. 无参构造

  2. 静态工厂

    ​ 标签中添加factory-

  3. 实例工厂

配置文件

依赖注入

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)

  1. <bean id = "userService" class="Service.Impl.UserServiceImpl">
  2. <!-- name为属性的名字, ref:注入容器id为userDao的变量-->
  3. <property name="userDao" ref="userDao"></property>
  4. </bean>

在service实现类中不需要使用application获取dao对象了,

可直接使用依赖注入的dao

  1. public class UserServiceImpl implements UserService {
  2. //成员变量
  3. private UserDao userDao;
  4. //使用依赖注入的dao对象
  5. public void setUserDao(UserDao userDao){
  6. //userDao为容器内部的注入
  7. this.userDao = userDao;
  8. }
  9. @Override
  10. public void save() {
  11. //不需要单独获取userDao了
  12. /*ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  13. UserDao userDao = (UserDao) app.getBean("userDao");*/
  14. userDao.sava();
  15. }
  16. }
  • 还可以p命名空间注入

2.构造方法的注入

(name为参数名,ref为id值得引用)

  1. <bean id = "userService" class="Service.Impl.UserServiceImpl">
  2. <!--构造方法注入-->
  3. <constructor-arg name="userDao" ref="userDao"></constructor-arg>
  4. </bean>

依赖注入的数据类型

  1. 普通数据类型

    1. <bean id = "userDao" class="Dao.Impl.UserDaoImpl">
    2. <!-- 普通数据依赖注入-->
    3. <property name="username" value="zhangsan"/>
    4. <property name="age" value="18"/>
    5. </bean>
  2. 引用数据类型

    list集合依赖注入

    map集合依赖注入

    properties注入

    1. <bean id = "userDao" class="Dao.Impl.UserDaoImpl">
    2. <!-- 2.list集合依赖注入-->
    3. <property name="strList">
    4. <list>
    5. <value>aaa</value>
    6. <value>bbb</value>
    7. <value>ccc</value>
    8. </list>
    9. </property>
    10. <!-- 3.map集合依赖注入-->
    11. <property name="userMap">
    12. <map>
    13. <!-- 注入两条user对象-->
    14. <entry key="user1" value-ref="user1"></entry>
    15. <entry key="user2" value-ref="user2"></entry>
    16. </map>
    17. </property>
    18. <!-- 4.properties注入-->
    19. <property name="properties">
    20. <props>
    21. <prop key="p1">p1</prop>
    22. <prop key="p2">p2</prop>
    23. <prop key="p3">p3</prop>
    24. </props>
    25. </property>
    26. </bean>

分模块配置文件

在 主配置文件 中导入 模块配置文件 即可

  1. <import resource="applicationContext-conduct.xml"/>
  2. <import resource="applicationContext-user.xml"/>

配置数据源

1.配置pom.xml文件

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid</artifactId>
  4. <version>1.0.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>8.0.23</version>
  10. </dependency>

2.配置jdbc.properties文件

  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.username=root
  3. jdbc.password=gyb20010204
  4. jdbc.url=jdbc:mysql://localhost:3306/travel

2.配置applicationContext-jdbc.xml

对DataSource进行依赖注入

    1. <context:property-placeholder location="classpath:jdbc.properties"/>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--此处beans标签下增加一行xmlns:context,但一般太长记不住,可以直接copy第一行的xmlns,
  3. 加一个context属性再把beans改成context-->
  4. <!--xsi:schemaLocation下复制一遍地址,把所有beans的地方修改成context-->
  5. <!--这样就算告诉xml我要用spring-context了-->
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xmlns:context="http://www.springframework.org/schema/context"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  11. <!--告诉xml,连接池的配置文件在哪-->
  12. <context:property-placeholder location="classpath:jdbc.properties"/>
  13. <!--开始创建bean对象,类型是DruidDataSource,由于bean对象是默认调用类的无参构造函数,
  14. 所以我们要把DruidDataSource的全类名告诉bean-->
  15. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  16. <!--因为DruidDataSource有setDriverClassName()等此类set函数,我们就可以选择set函数来实现注入-->
  17. <!--其中name中的内容为属性,也就是set函数中set后面的内容,并把首字母变小写,
  18. 比如setUrl(),那name就是url-->
  19. <!--value中我们通过spEL来获取到jdbc.properties的值,spEL也就是spring expression language
  20. 类似jsp中的el-->
  21. <property name="driverClassName" value="${jdbc.driver}"></property>
  22. <property name="url" value="${jdbc.url}"></property>
  23. <property name="username" value="${jdbc.username}"></property>
  24. <property name="password" value="${jdbc.password}"></property>
  25. </bean>
  26. </beans>

3.测试类进行测试

  1. /**
  2. * 测试spring注入的druid数据源
  3. */
  4. @Test
  5. public void jdbcTes t01() throws SQLException {
  6. //获取bean
  7. ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  8. //获取数据源
  9. DataSource dataSource = app.getBean(DataSource.class);
  10. //获取连接
  11. Connection connection = dataSource.getConnection();
  12. System.out.println(connection);
  13. //关闭连接
  14. connection.close();
  15. }

spring注解开发

开发步骤

1.在要创建的bean类上添加注解@Component("id")

如UserDaoImpl:

  1. //<bean id = "userDao" class="Dao.Impl.UserDaoImpl">
  2. //注解开发,创建bean
  3. @Component("userDao")
  4. public class UserDaoImpl implements UserDao {
  5. ...

2.在bean内类注入添加注解@Autowired****

@Qualifier("id")****

如在UserServiceImpl内注入UserDaoImpl

  1. //<bean id = "userService" class="Service.Impl.UserServiceImpl">
  2. //注解开发,创建serviceImplBean,引号内相当于id
  3. @Component("userService")
  4. public class UserServiceImpl implements UserService {
  5. /*在service内注入dao
  6. <property name="userDao" ref="userDao"></property>*/
  7. @Autowired
  8. @Qualifier("userDao")
  9. //成员变量
  10. private UserDao userDao;
  11. ...

3.配置组件扫描,可以扫描文件及其子包

  1. <context:component-scan base-package="Dao"/>
  2. <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

步骤

  1. 导入Spring集成Junit的坐标

    1. <!-- spring测试-->
    2. <dependency>
    3. <groupId>org.springframework</groupId>
    4. <artifactId>spring-test</artifactId>
    5. <version>5.0.2.RELEASE</version>
    6. </dependency>
  2. 使用@Runwith注解替换原来的运行期

  3. 使用@ContextConfiguration指定配置文件或配置类

  4. 使用@Autowired注入需要测试的对象

  5. 创建测试方法进行测试

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext.xml")
  3. public class SpringJunitTest {
  4. @Autowired
  5. private UserService service;
  6. @Test
  7. public void test1(){
  8. service.save();
  9. }
  10. }

Spring笔记(1)的更多相关文章

  1. Spring笔记02_注解_IOC

    目录 Spring笔记02 1. Spring整合连接池 1.1 Spring整合C3P0 1.2 Spring整合DBCP 1.3 最终版 2. 基于注解的IOC配置 2.1 导包 2.2 配置文件 ...

  2. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

  3. Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

    Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

  4. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  5. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

  6. Spring:笔记整理(1)——HelloWorld

    Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...

  7. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  8. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  9. spring笔记----看书笔记

    上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...

  10. Spring 笔记(三)Bean 装配

    前言 Spring 有两大核心,也就分成两份笔记分别记录. 其一是管理应用中对象之间的协作关系,实现方式是依赖注入(DI),注入依赖的过程也被称为装配(Wiring). 基于 JavaConfig 的 ...

随机推荐

  1. 构建前端第10篇之---Function.prototype.call()

    张艳涛写于2020-01-25,参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ ...

  2. 用 JavaScript 刷 LeetCode 的正确姿势【进阶】

    之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...

  3. MVC从客户端中检测到有潜在危险的Request.Form值的解决方法

    1.ASPX页面 在页面头部的page中加入ValidateRequest="false" 2.web.config中配置validateRequest="false&q ...

  4. Android 自定义属性(attrs)、样式(Style)、主题(Theme)

    Android 自定义属性(attrs).样式(Style).主题(Theme) https://www.cnblogs.com/dandre/p/4507024.html https://blog. ...

  5. Commons-Beanutils利用链分析

    前言 本篇开始介绍 commons-beanutils 利用链,注意Commons-Beanutils 不是Commons-Collections 不要看混了,首先来看一下,什么是 commons-b ...

  6. C++ 封装类 2 设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号

    1 //设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号 2 #include <iostream> 3 #include<string> 4 ...

  7. 为什么不建议使用WordPress呢?

    程序过于注重扩展性与动态配置解析,导致执行流程中包含大量的钩子.判断.文件加载等操作,导致执行效率偏低,对服务器要求较高.对系统的开销,尤其是CPU等部分消耗较大,据观察,单个请求在腾讯云s1主机单核 ...

  8. A*算法寻路(C++代码实现)

    A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法.算法中的距离估算值与实际值越接近,最终搜索速度越快.--来自百度百科. 我在网上看了不少关于A ...

  9. netty系列之:自定义编码解码器

    目录 简介 自定义编码器 自定义解码器 添加编码解码器到pipeline 计算2的N次方 总结 简介 在之前的netty系列文章中,我们讲到了如何将对象或者String转换成为ByteBuf,通过使用 ...

  10. SpringBoot开发八-会话管理

    需求介绍-会话管理 利用Cookie和Seesion使得HTTP变成有会话的连接,写几个实例演示一下 代码实现 先写个例子,表示客户端第一次访问服务器,服务器端创建一个Cookie发送给客户端. 不管 ...