Spring的入门及案例----Ioc

2023-11-10

一:Spring的核心

Spring的核心是控制反转(IoC)面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架

  • IoC:控制反转。
    对于Spring来说,Spring创建对象的过程,不是在代码里面实现,而是交给Spring来进行配置实现的。(Bean.xml)
  • AOP:面向切面编程。 

二:Spring的特点

l  方便解耦,简化开发  (高内聚低耦合)

•    Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理

•    spring工厂是用于生成bean

l  AOP编程的支持

•    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

l  声明式事务的支持

•    只需要通过配置就可以完成对事务的管理,而无需手动编程

l  方便程序的测试

•    Spring对Junit4支持,可以通过注解方便的测试Spring程序

l  方便集成各种优秀框架

•    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

l  降低JavaEE API的使用难度

•    Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

三:入门案例Ioc

简介:Ioc就是让Spring去创建类的实例,而并非去类中去创建。

<bean id="userServiceId" class="com.hao.a_ioc.UserServiceImpl"></bean>

1.导入jar包:

                  4 + 1  : 4个核心(beans、core、context、expression) + 1个依赖(commons-loggins...jar)

2.提供接口和实现类(UserService)

public interface UserService {
	
	public void addUser();

}
public class UserServiceImpl implements UserService {

	@Override
	public void addUser() {
		System.out.println("ico add user");
	}

}

3.配置文件

l  位置:任意,开发中一般在classpath下(src)

l  名称:任意,开发中常用applicationContext.xml

l  内容:添加schema约束

       约束文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html


<?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">
	<!-- 配置service 
		<bean> 配置需要创建的对象
			id :用于之后从spring容器获得实例时使用的
			class :需要创建实例的全限定类名
	-->
	<bean id="userServiceId" class="com.hao.a_ioc.UserServiceImpl"></bean>
</beans>

4.测试

    @Test
	public void demo02(){
		//从spring容器获得
		//1 获得容器
		String xmlPath = "com/hao/a_ioc/beans.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		//2获得内容 --不需要自己new,都是从spring容器获得
		UserService userService = (UserService) applicationContext.getBean("userServiceId");
		userService.addUser();
		
	}


四:入门案例DI

简介:DI(Dependency Injection )依赖注入:在创建实例的过程中,向类里面的属性中设置值。

模拟spring执行过程

       创建service实例:BookService bookService = newBookServiceImpl()      -->IoC  <bean>

       创建dao实例:BookDao bookDao = new BookDaoImple()                          -->IoC

       将dao设置给service:bookService.setBookDao(bookDao);                         -->DI   <property>

步骤:

    l       创建BookDao接口和实现类

    l       创建BookService接口和实现类

    l       将dao和service配置 xml文件

    l       使用api测试



public interface BookDao {
	
	public void addBook();

}
 
public class BookDaoImpl implements BookDao {

	@Override
	public void addBook() {
		System.out.println("di  add book");
	}

}
public interface BookService {

	public abstract void addBook();

}
public class BookServiceImpl implements BookService {
	
	// 方式1:之前,接口=实现类
//	private BookDao bookDao = new BookDaoImpl();
	// 方式2:接口 + setter
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}
	
	@Override
	public void addBook(){
		this.bookDao.addBook();
	}

}

<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">
	<!-- 
	模拟spring执行过程
		创建service实例:BookService bookService = new BookServiceImpl()	IoC  <bean>
		创建dao实例:BookDao bookDao = new BookDaoImpl()			IoC
		将dao设置给service:bookService.setBookDao(bookDao);		DI   <property>
		
		<property> 用于进行属性注入
			name: bean的属性名,通过setter方法获得
				setBookDao ##> BookDao  ##> bookDao
			ref :另一个bean的id值的引用
	 -->

	<!-- 创建service -->
	<bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
		<property name="bookDao" ref="bookDaoId"></property>
	</bean>
	
	<!-- 创建dao实例 -->
	<bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
	

</beans>
@Test
	public void demo01(){
		//从spring容器获得
		String xmlPath = "com/hao/b_di/beans.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
		
		bookService.addBook();
		
	}

五:装配Bean

Bean的实例化方式:默认构造,静态工厂, 实例工厂

 

l  实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。

工厂:

/**
 * 实例工厂,所有方法非静态
 *
 */
public class MyBeanFactory {
	
	/**
	 * 创建实例
	 * @return
	 */
	public UserService createService(){
		return new UserServiceImpl();
	}

}

Spring配置

<!-- 创建工厂实例 -->
	<bean id="myBeanFactoryId" class="com.itheima.c_inject.c_factory.MyBeanFactory"></bean>
	<!-- 获得userservice 
		* factory-bean 确定工厂实例
		* factory-method 确定普通方法
	-->
	<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>

六:装配Bean基于注解

l  注解:就是一个类,使用@注解名称

l  开发中:使用注解 取代 xml配置文件。

 

 

1. @Component取代<bean class="">

       @Component("id")取代 <beanid="" class="">

2.web开发,提供3个@Component注解衍生注解(功能一样)取代<beanclass="">

       @Repository:dao层

       @Service:service层

       @Controller:web层

3.依赖注入    ,给私有字段设置,也可以给setter方法设置

       普通值:@Value("")

       引用值:

              方式1:按照【类型】注入

                     @Autowired

              方式2:按照【名称】注入1

                     @Autowired

                     @Qualifier("名称")

              方式3:按照【名称】注入2

                     @Resource("名称")

4.生命周期

       初始化:@PostConstruct

       销毁:@PreDestroy

5.作用域

       @Scope("prototype")多例

 

l  注解使用前提,添加命名空间,让spring扫描含有注解类

<!-- 组件扫描,扫描含有注解的类 -->
	<context:component-scan base-package="com.itheima.g_annotation.a_ioc"></context:component-scan>

<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">
	<!-- 组件扫描,扫描含有注解的类 -->
	<context:component-scan base-package="com.itheima.g_annotation.a_ioc"></context:component-scan>
</beans>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring的入门及案例----Ioc 的相关文章

随机推荐

  • 泰勒公式求极限(如何用+精度怎么确定)一文扫除泰勒公式难点

    有些复杂的极限题 里面会涵盖着各种各样的函数 这些群魔乱舞的函数加大了我们计算极限的难度 此时想 如果可以将这些函数统一成一样的形式该多好 此时 就有我们的泰勒公式了 1 泰勒公式怎么用 指数函数 三角函数 反三角函数 对数函数等函数 同时
  • 正序分解整数,把一串数字倒过来逐字输出

    问题 正序分解整数 文章目录 问题 正序分解整数 1 解决 2 初步想法 2 1 结果 2 2 问题 3 更改 3 1顺便提一嘴 3 1 2 C 库函数 pow 3 1 3描述 3 1 4声明
  • 【机器学习】DBSCAN密度聚类算法(理论 + 图解)

    文章目录 一 前言 二 DBSCAN聚类算法 三 DBSCAN算法步骤 四 算法的理解 五 常用评估方法 轮廓系数 一 前言 之前学聚类算法的时候 有层次聚类 系统聚类 K means聚类 K中心聚类 最后呢 被DBSCAN聚类算法迷上了
  • Android Studio中Intel HAXM的那些坑

    最近用过两台电脑折腾Android Studio 都是windows的系统 不知道为什么连着踩了两个坑 第一台我结束了qemu system i386 exe这个倒霉的进程 导致我开启模拟器的时候一直提示我没有安装Intel HAXM 没办
  • mySQL常用DDL命令

    mysql常用DDL命令 1 创建数据库 2 查看数据库 3 查看数据库创建明细 4 修改数据库编码 5 删除数据库 6 使用数据库 7 创建表 8 查看表的结构 9 在表中插入列 字段 10 修改列 字段 的属性 11 删除某列 字段 1
  • 首字母变大写

    小写字母变大写m 0 m 0 32 include
  • 【周末闲谈】剑指offer,了解面试,学会面试

    我们在找工作时 需要结合自己的现状 针对意向企业做好充分准备 作为程序员 你有哪些面试IT技术岗的技巧 你可以从一下几个方向谈谈你的想法和观点 个人主页 个人主页 系列专栏 周末闲谈 文章目录 前言 剑指Offer 面试指南 一 了解你的面
  • Java学习笔记(十八)

    Spring Boot 什么是 Spring Boot Spring Boot 已经建立在现有 spring 框架之上 使用 spring 启动 避免了之前我们必须做的所有样板代码和配置 因此 SpringBoot 可以帮助我们以最少的工作
  • vue项目中实现扫码登录

    1 需求描述 PC端实现两种登录方式 账号登录 扫码登录 扫码登录未绑定账号 弹框提示绑定账号 账号登录 未绑定微信 弹框提示 效果图 2 扫码登录未绑定账号 弹框提示绑定账号 2 1 安装 qrcode npm install qrcod
  • TFS淘宝分布式文件核心存储引擎源码架构剖析实现

    这里写目录标题 相关背景介绍 相关设计思路介绍 项目基础 文件系统接口 扇区 文件结构 关于inode 为什么淘宝不用小文件存储 淘宝网为什么不用普通文件存储海量小数据 设计思路 关键数据结构哈希表 代码日志 mmp file h mmap
  • 31_access 日志

    文章目录 过滤模块的位置 返回响应 加工响应内容 过滤模块的位置 接收 http 头部 gt pre access 阶段 gt limit req 模块 gt limit conn 模块 gt access 阶段 gt access 模块
  • Java java.lang.NumberFormatException: For input string: ““问题解决

    问题描述 java lang NumberFormatException For input string 问题分析 1 使用Long parseLong Integer parseInt Double parseDouble Float
  • BP神经网络理解原理——用Python编程实现识别手写数字(翻译英文文献)

    BP神经网络理解原理 用Python编程实现识别手写数字 备注 这里可以用这个方法在csdn中编辑公式 https www zybuluo com codeep note 163962 一 前言 本文主要根据一片英文书籍进行学习 并且尝试着
  • CCProxy网络共享代理服务端配置使用

    CCProxy是一个局域网络共享工具 可用于VPN共享等 1 解压安装CCProxy工具 双击CCProxy exe启动 打开如下界面 2 打开设置界面 设置对外共享的IP地址和端口号 如下 点击确定 最后再点击启动即可
  • OAuth2扩展access_token(二)

    接着上一篇继续展示其他功能 2 1 如何拿着生成的access token获取用户详情信息 有的小伙伴可能好奇这个jti是合适呢么东西 这个是jwt生成令牌的唯一标识 后期我们还要拿它来整合redis哦 因为他是唯一的 我们可以把它作为ke
  • Mac系统CLion中C语言EOF如何结束输入(楼主亲测有效)

    今日发现在mac系统CLion中C语言EOF没有办法结束输入 如下代码 我写了一个C语言程序 以EOF结束 include
  • 《Thinking in Java》读后总结与感想

    作为Java界的四大名著之一 Thinking in Java 一直备受推崇 我很早就知道了这本书 当时只是初涉Java 粗略的翻了翻之后觉得看起来这本书讲的比较深就没有再去碰它 后来Java基础学完之后又忙着学Android开发的知识 就
  • 如何打开mysql_MySQL教程

    MySQL经常和 数据库 连在一起读 这很容易对新手造成误解 认为MySQL就是一个数据库 其实不是这样 MySQL是数据库的集合 MySQL里面有很多数据库 那么数据是直接存在数据库里的吗 并不 数据库底下还有一个叫做数据表的存储单元 数
  • 无需公网IP,安全访问云端资源,3步搞定

    某企业将OA ERP Git代码库等业务资源 分别部署在了公有云和私有云 但随着业务发展 分部和移动办公人员逐渐增多 如何高效实现50名员工安全远程访问云端资源成了难题 使用MPLS专线 IPSec VPN等传统方案实现远程访问 不仅实施费
  • Spring的入门及案例----Ioc

    一 Spring的核心 Spring的核心是控制反转 IoC 和面向切面 AOP 简单来说 Spring是一个分层的JavaSE EEfull stack 一站式 轻量级开源框架 IoC 控制反转 对于Spring来说 Spring创建对象