IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring -> 正文阅读

[Java知识库]Spring

1. Spring介绍

Spring是一个企业级应用框架,其中包含了大量的各种应用组件,Spring框架为现代基于java的企业级应用程序提供了一个全面的编程和配置模型,能够在任何类型的部署平台进行部署.其核心是IoC及AOP。

Spring中的两个核心概念

1.1 IoC

控制反转(Inversion of Control),将原来我们来完成的实例化过程,交给
容器来完成,对组件对象的控制权从代码本身转移到容器.
组件的思想:分离专注点,使用接口,不再关注实现.
依赖的注入:将组建的构建和实现分离

  • DI
    依赖注入,依赖于某一个媒介完成对对象的初始化或者是赋值。

1.2 AOP

面向切面编程(Aspect Oriented Programing)

1.3 Spring 优点

  • 低浸入式编程
  • 独立于各种应用服务器
  • 依赖注入特性将组件关系透明化,降低了耦合度
  • 面向切面编程特性允许将通用任务进行集中是处理
  • 与第三方框架的良好整合

1.4 Spring工程构建

1.4.1 Maven Spring依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>

1.4.2 Spring核心配置文件编写

<?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>
1.4.2.1 完成控制反转以及依赖注入
<bean id="userInfo" class="com.domain.UserInfo">
</bean>
<!--完成依赖注入 DI-->
<property name="username" value="张三" />
<property name="content" value="刘家豪大笨蛋!" />
<bean id="userInfo" class="com.domain.UserInfo">
<!--完成依赖注入 DI-->
<property name="username" value="张三" />
<property name="content" value="刘家豪大笨蛋!" />
</bean>

bean的id名称,在同一个配置文件下,是只能拥有一个,不能够出现重复的id名称!

<bean id="userInfo" class="com.domain.UserInfo">
<!--完成依赖注入 DI-->
<property name="username" value="张三" />
<property name="content" value="刘家豪大笨蛋!" />
</bean>
<bean id="userInfo" class="com.domain.UserInfo">
<!--完成依赖注入 DI-->
<property name="username" value="李四" />
<property name="content" value="翟雪松大帅哥!" />
</bean>

org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: Bean name ‘userInfo’ is already used in this
element
Offending resource: class path resource [applicationContext.xml]

1.4.2.2 测试
@Test
public void testInit() {
	//步骤1:获取到ApplicationContext对象
	//ClassPathXmlApplicationContext:代表从类路径下加载xml配置文件,返回ApplicationContext的对象
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml") ;
	//步骤2:从ApplicationContext容器中获取到userInfo的对象
	UserInfo userInfo = (UserInfo) ctx.getBean("userInfo") ;
	userInfo.say();
}
1.4.2.3 Spring中的IoC产生的对象是否是单例模式
	//ClassPathXmlApplicationContext:代表从类路径下加载xml配置文件,返回ApplicationContext的对象
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml") ;
	//步骤2:从ApplicationContext容器中获取到userInfo的对象
	UserInfo userInfo = (UserInfo) ctx.getBean("userInfo1") ;
	userInfo.say();
	System.out.println(userInfo);
	userInfo = (UserInfo) ctx.getBean("userInfo1") ;
	userInfo.say();
	System.out.println(userInfo);

以上代码,对同一个bean进行两次调用,得到对象是同一个对象,说明在Spring的设计当中,所使用的
是单例设计模式!每一个调用的bean,都会生成一个新的对象。

<bean id="userInfo1" class="com.domain.UserInfo">
	<!--完成依赖注入 DI-->
	<property name="username" value="张三" />
	<property name="content" value="刘家豪大笨蛋!" />
</bean>
<bean id="userInfo2" class="com.domain.UserInfo">
	<!--完成依赖注入 DI-->
	<property name="username" value="李四" />
	<property name="content" value="翟雪松大帅哥!" />
</bean>

1.5 bean的三种实例化方式

1.5.1 构造方法方式【重点】

  • BookDaoImpl实现类

    public class BookDaoImpl implements BookDao {
    	public BookDaoImpl() {
    		System.out.println("book dao constructor is running ....");
    	}
    	public void save() {
    		System.out.println("book dao save ...");
    	}
    }
    
  • applicationContext.xml配置

    	<!--方式一:构造方法实例化bean-->
    	<bean id="bookDao" class="com.csi.dao.impl.BookDaoImpl"/>
    
  • AppForInstanceBook测试类

    public class AppForInstanceBook {
    	public static void main(String[] args) {
    		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    		bookDao.save();
    	}
    }
    

1.5.2 静态工厂方式

  • OrderDao接口和OrderDaoImpl实现类

    	public interface OrderDao {
    		public void save();
    	}
    	
    	public class OrderDaoImpl implements OrderDao {
    		public void save() {
    			System.out.println("order dao save ...");
    		}
    	}
    
  • OrderFactory工厂类

    	//静态工厂创建对象
    	public class OrderDaoFactory {
    		public static OrderDao getOrderDao(){
    			System.out.println("factory setup....");
    			return new OrderDaoImpl();
    		}
    	}
    
  • applicationContext.xml配置

    	<!--方式二:使用静态工厂实例化bean-->
    	<bean id="orderDao" class="com.csi.factory.OrderDaoFactory" 	factorymethod="getOrderDao"/>
    
  • AppForInstaceOrder测试类

    	public class AppForInstanceOrder {
    		public static void main(String[] args) {
    			ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    			OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");
    			orderDao.save();
    		}
    }
    

1.5.3 实例工厂方式

  • UserDao接口和UserDaoImpl实现类

    	public interface UserDao {
    		public void save();
    	}
    	public class UserDaoImpl implements UserDao {
    		public void save() {
    			System.out.println("user dao save ...");
    		}
    	}
    
  • UserDaoFactory工厂类

    	//实例工厂创建对象
    	public class UserDaoFactory {
    		public UserDao getUserDao(){
    		return new UserDaoImpl();
    	 }
    	}
    
  • applicationContext.xml配置

    <!--方式三:使用实例工厂实例化bean-->
    <bean id="userFactory" class="com.csi.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
    
  • AppForInstanceUser测试类

    public class AppForInstanceUser {
    	public static void main(String[] args) {
    	// //创建实例工厂对象
    	// UserDaoFactory userDaoFactory = new UserDaoFactory();
    	// //通过实例工厂对象创建对象
    	// UserDao userDao = userDaoFactory.getUserDao();
    	// userDao.save();
    	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    	UserDao userDao = (UserDao) ctx.getBean("userDao");
    	userDao.save();
      }
    }
    

1.6 bean的生命周期

  • 使用init-method及destory-mothod

    public class BookDaoImpl implements BookDao {
       public void save() {
       System.out.println("book dao save ...");
       }
       //表示bean初始化对应的操作
       public void init(){
       System.out.println("init...");
       }
       //表示bean销毁前对应的操作
       public void destory(){
       System.out.println("destory...");
       }
    }
    
    <bean id="bookDao" class="com.csi.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
    
    public class AppForLifeCycle {
    	public static void main( String[] args ) {
    	//此处需要使用实现类类型,接口类型没有close方法
    	ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    	BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    	bookDao.save();
    	//ctx.registerShutdownHook();
    	//关闭容器,执行销毁的方法
    	ctx.close();
    	}
    }
    
  • 实现initializingBean,DisposableBean接口

    public class BookServiceImpl implements BookService,InitializingBean,DisposableBean {
    	private BookDao bookDao;
    	public void setBookDao(BookDao bookDao) {
    		System.out.println("set .....");
    		this.bookDao = bookDao;
    	}
    	public void save() {
    		System.out.println("book service save ...");
    		bookDao.save();
    	}
    	public void destroy() throws Exception {
    		System.out.println("service destroy");
    	}
    	public void afterPropertiesSet() throws Exception {
    	System.out.println("service init");
    	}
    }
    

1.61 Bean的销毁时机

  • 容器关闭时触发bean的销毁
  • 关闭容器的方式:
    • 手动关闭容器
      ConfigurableApplicationContext 接口 close() 操作
    • 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
      ConfigurableApplicationContext 接口 registerShutdownHook() 操作
      public class AppForLifeCycle {
       	public static void main( String[] args ) {
       	//此处需要使用实现类类型,接口类型没有close方法
       	ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
       	BookDao bookDao = (BookDao) ctx.getBean("bookDao");
       	bookDao.save();
       	//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
       	ctx.registerShutdownHook();
       	//关闭容器
       	//ctx.close();
        }
       }
      
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-25 23:07:17  更:2022-09-25 23:08:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 15:46:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码