Spring学习笔记(一)—Spring基本应用

spring概述

一、spring框架的优点:

  •     非侵入式设计:可以使应用程序代码对框架的依赖最小化(允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口。
  • 方便解耦、简华开发:spring就是一个大工厂,可以将对象的创建和依赖关系的维护工作都交给Spring容器管理。大大降低了组件之间的耦合性。
  • 支持AOP:允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
  • 支持声明式事务处理:通过配置就可以完成事务的管理,无需手动编程
  • 方便程序的测试:Spring提供了Junit4的支持,可以通过注解方式直接测试Spring程序。
  • 方便集成各种优秀框架
  • 降低了JavaEE API使用难度:对一些JavaEE中难用的API(如jdbc,javaMail)进行封装。

Spring体系结构

    一:主要的模块介绍:

    1、Core Container(核心容器):是其他模块建立的基础,主要有beans模块。Core模块,Context模块,Context-support模块和SpEl模块组成。   

  • Beans:提供BeanFactory,工厂模式的经典实现,Spring将管理对象称为Bean。
  • Core核心模块:提供Spring框架的基本组成部分。包括IoC和DI功能。
  • Context-support;提供对第三方嵌入Spring应用的集成支持。
  • SpEL:表达式语言

    2、Data Access/Integration(数据访问/集成)

  • JDBC:提供了jdbc的抽象层。
  • orm模块:对流行的对象关系映射API,包括JPA/JDO和hibernate提供集成层支持
  • oxm模块:提供支持对象/xml映射的抽象层实现。
  • JMS:java消息传递服务。
  • Transactions事务模块:对实现特殊接口以及所有POJO类编程和声明式的事务管理。

    3、web

  • WebSocket:提供WebSocket和sockJS的实现。
  • Servlet:包含Spring的模型—视图—控制器和REST Web services实现的Web应用程序。
  • web:提供基本的web应用开发集成特性,例如:多文件上传功能等。
  • protlet

    4、其他模块

  • AOP模块:提供面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分类,降低耦合性。
  • Aspects模块:提供与AspectJ的集成功能,AspectJ是一个功能强大且面向切面编程(AOP)框架。
  • Instrumentation模块:提供了类工具的支持和类加载器的实现,可以在特定服务器中使用。
  • messaging模块:消息传递体系结构和协议的支持。
  • Test:对单元测试和集成测试的支持。

Spring的核心容器

一、BeanFactory

    由org.springframework.beans.factory.BeanFactory接口定义,基础类型的IOC容器。是一个管理Bean的工厂,主要负责初始化各种Bean,并调用他们的生命周期方法。

二、ApplicationContext

    是BeanFactory的子接口,也成为应用上下文,是另一种常用的Spring核心容器。创建ApplicationContext接口实例的具体方法:

    1、通过ClassPathXmlApplicationContext创建

    ClassPathXmlApplicationContext从类路径classPath中寻找指定的xml配置文件,找到并装载完成ApplicationContext的实例化工作

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation)

    configLocation用于指定spring配置文件的名称和位置。

    2、通过FileSystemXmlApplicationContext创建

    FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。用法如下:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation)

    读取配置文件时,通过参数指定配置文件的位置。一定是绝对路径。

    使用Spring框架时,可以通过实例化其中任何一个雷来创建ApplicationContext容器。在Web中,ApplicationContext容器的实例化工作会交由Web服务器来完成。通常基于ContextLoaderListener实现的方式。只需在web.xml添加如下代码。

<!--指定Spring配置文件的位置,多个配置文件时,以逗号分隔- >
  <context-param>
  <param-name>contextConfigLocation</param-name>
  <!- Spring 将加载spring目录下的applicationContext,xm1文件->
  <param-value>
  classpath:spring/applicationContext. xml</param-value></ context-param>
  <!--  指定以ContextLoaderListener方式启动Spring容器-->
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

    在创建完Spring容器后,可以获取Spring中的Bean。有两种方法

  • Object getBean(String name):根据容器中Bean的id或者name来获取指定的Bean,获取后需要进行强制转换。
  • <T>T getBean(Class<T> requiredType):根据类的类型来获取Bean的实例。此方法为泛型方法,因此不需要强制转换。

***BeanFactory和ApplicationContext都是通过XML配置文件加载Bean的,二者区别:如果Bean的某一个属性没有注入,使用BeanFactory加载后,在第一次调用getBean()方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。

Spring入门程序

一、IOC底层原理

  • xml配置文件
  • dom4j解决xml
  • 工厂设计模式
  • 反射

    如图:

                            

                                                来源:传智播客


(1)创建工程后,在ico包中创建接口UserDao 并定义各一个say()方法。

public interface UserDao {
	public void say();

}

(2)创建接口实现类UserDaoImpl 实现接口中say()方法

public class UserDaoImpl implements UserDao{

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("userDao say hello world!");
	}

}

(3)在src目录下创建Spring的配置文件applicationContext.xml 并在文件中创建一个id为userDao的Bean

<?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-4.3.xsd">
	<!-- 将制定类配置给spring ,让spring创建其对象的实例 -->
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
	</bean>
</beans>

     其中class属性用于指定需要实例化的Bean的类。

(4)创建测试类 TestIoc main方法中需要初始化Spring容器,并加载配置文件,然后通过Spring容器获取userDao实例。最后调用say方法。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIoc {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//初始化spring容器,加载配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		//通过容器获取userDao实例
		UserDao userDao = (UserDao)applicationContext.getBean("userDao");
		//调用实例中的方法
		userDao.say();
	}

}

    该程序并没有通过new关键字创建UserDao接口的实现类对象,而是通过Spring容器来获取实现类对象,这就是SpringIOC工作机制。

依赖注入

    依赖注入(Dependency Injection 简称DI)与控制反转(IoC)的含义相同,只不过两个称呼从两个角度来描述同一个概念。

    当某个java对象(调用者)需要调用另一个java对象(被调用者,即被依赖对象)时,传统模式会采用“new一个被调用者”。但是会导致调用者和被调用者之间耦合性增加,不利于升级和维护。

    在Spring 中对象的实例由spring容器来创建,Spring容器会负责控制程序之间的关系,而不是调用者的程序直接控制。控制权由应用代码转移到spring容器,控制权发展反转。

  从spring容器看:spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入了它依赖的实例。即为依赖注入


一、依赖注入的实现方式

    依赖注入的作用在spring框架创建对象时,动态的将其所依赖的对象注入Bean组件中,通常有两种。一种是使用setter方法注入,另一种使用构造方法注入。

  • 属性setter方法注入:通过调用无参构造函数或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现依赖注入
  • 构造方法注入:通过调用带参数的构造方法来实现,每一个参数代表着一个依赖

1、以setter方式注入

(1)userservice类:
public interface UserService {
	public void say();
}
(2)userserviceImpl:
public class UserServiceImpl implements UserService {

	//声明UserDao属性
	private UserDao userDao;
	//添加UserDao属性的setter方法,用于事项依赖注入
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	//实现接口中的方法
	public void say() {
		//调用userDao中的say方法,并输出语句
		System.out.println("userDao.say也运行了");
		this.userDao.say();
		System.out.println("userSevice say hello!");
	}
}
(3)在配置文件中创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao注入到userService中:
<?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-4.3.xsd">
	<!-- 将制定类配置给spring ,让spring创建其对象的实例 -->
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
	<!-- 添加一个userSerivce的实例 -->
	<bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
	<!-- 将id为userDao的Bean实例注入到userService实例中 -->
	<property name = "userDao" ref = "userDao"/>
	</bean>
</beans>    

    上述代码中<property>是<bean>元素的子元素,用于调用Bean实例中的setUserDao方法完成属性赋值。完成依赖注入,name表示bean实例中的相应属性名,ref表示用于指定其属性。

(4)测试:

    

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//初始化spring容器,加载配置文件
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		//通过容器获取userService实例
		UserService service = (UserService)applicationContext.getBean("userService");
		service.say();

	}

}

Ioc和DI的区别:

  1. Ioc:控制反转,把对象创建交给spring进行配置。
  2. DI:依赖注入,向类里面的属性中设置值。
  3. 关系:依赖注入不能单独存在,需要在ioc基础上完成操作。

ps:复习spring框架时所记录的笔记。转载请注明。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring一个开源的Java框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发式,通过依赖注入和面向切面编程等特性,简化了Java应用程序的开发过程。 以下是关于Spring学习的一些笔记: 1. IoC(控制反转):Spring通过IoC容器管理对象的创建和依赖关系的注入。通过配置文件或注解,将对象的创建和依赖关系的维护交给Spring容器来管理,降低了组件之间的耦合度。 2. DI(依赖注入):Spring通过依赖注入将对象之间的依赖关系解耦。通过构造函数、Setter法或注解,将依赖的对象注入到目标对象中,使得对象之间的关系更加灵活和可维护。 3. AOP(面向切面编程):Spring提供了AOP的支持,可以将与业务逻辑无关的横切关注点(如日志、事务管理等)从业务逻辑中分离出来,提高了代码的可重用性和可维护性。 4. MVC(模型-视图-控制器):Spring提供了一个MVC框架,用于构建Web应用程序。通过DispatcherServlet、Controller、ViewResolver等组件,实现了请求的分发和处理,将业务逻辑和视图展示进行了分离。 5. JDBC和ORM支持:Spring提供了对JDBC和ORM框架(如Hibernate、MyBatis)的集成支持,简化了数据库访问的操作,提高了开发效率。 6. 事务管理:Spring提供了对事务的支持,通过声明式事务管理和编程式事务管理,实现了对数据库事务的控制和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值