当前位置: 首页 > news >正文

Spring框架说明

1.IOC控制反转

IoC思想: Inversion of Control,翻译为“控制反转”或“反转控制”,强调的是原来在程序中创建Bean的权利反转给第三方。 例如:原来在程序中手动的去 new UserServiceImpl(),手动的去new UserDaoImpl(),而根据IoC思想的指导, 寻求一个第三方去创建UserServiceImpl对象和UserDaoImpl对象。这样程序与具体对象就失去的直接联系。

2.DI依赖注入

将UserDao在BeanFactory内部设置 给UserService的过程叫做“注入” ,而UserService需要依赖UserDao 的注入才能正常工作,这个过程叫做 “依赖注入。

某个Bean的完整创建依赖于其他Bean(或普通参数)的注入。

3.AOP面向切面

当通用的事务功能耦合在业务代码中,例如通用的日志功能耦合在业务代码中。

借助于IoC思想,将Bean的创建权反转给BeanFactory,而BeanFactory生产的Bean是目标Bean的代理对象,这样就可以在代理对象中对目标对象方法进行相应的增强。

AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程。

4.Spring框架

5.基于注解的ioc开发

(1)自定义bean的生成

可以通过@Component注解的value属性指定当前Bean实例的beanName,也可以省略不写,不写的情况下为当前 类名首字母小写。

通过@ComponentScan注解配置要扫描的bean的位置。

通过@Scope注解,在类上或使用了@Bean标注的方法上,标注Bean的作用范围,取值为 singleton或prototype。

通过@Lazy注解,在类上或使用了@Bean标注的方法上,标注Bean是否延迟加载,取值为 true和false。

通过@PostConstruct注解,在方法上使用,标注Bean的实例化后执行的方法。

通过@PreDestroy,在方法上使用,标注Bean的销毁前执行方法。

由于JavaEE开发是分层的,为了每层Bean标识的注解语义化更加明确,@Component又衍生出如下三个注解:

@Repository:在Dao层类上使用

@Service:在Service层类上使用

@Controller:在Web层类上使用

(2)bean的注入

@Value:使用在字段或方法上,用于注入普通数据。

@Autowired:使用在字段或方法上,用于根据类型(byType)注入引用数据。

@Qualifier:使用在字段或方法上,结合@Autowired,根据名称注入。

@Resource:使用在字段或方法上,根据类型或名称进行注入。

(3)非自定义bean的生成

非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化, 使用@Bean标注方法即可,@Bean的属性为beanName,如不指定bean的名字默认为当前工厂方法名称。工厂方法所在类必须要被Spring管理,即类上需要添加@Compotent注解。

如果@Bean工厂方法需要参数的话,则有如下几种注入方式:

使用@Autowired 根据类型自动进行Bean的匹配,@Autowired可以省略。

使用@Qualifier 根据名称进行Bean的匹配。

使用@Value 根据名称进行普通数据类型匹配。

(4)Bean配置类的开发

@Configuration注解标识的类为配置类,替代原有xml配置文件,该注解第一个作用是标识该类是一个配置类,第 二个作用是具备@Component作用。

@Configuration
public class ApplicationContextConfig {}

@ComponentScan 组件扫描配置,替代原有xml文件中的。

@Configuration
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class ApplicationContextConfig {}

base-package的配置方式:

指定一个或多个包名:扫描指定包及其子包下使用注解的类。

不配置包名:扫描当前@componentScan注解配置类所在包及其子包下的类。

@PropertySource 注解用于加载外部properties资源配置,替代原有xml中的 配置。

@Configuration
@ComponentScan
@PropertySource({"classpath:jdbc.properties","classpath:xxx.properties"})
public class ApplicationContextConfig {}

@Import 用于加载其他配置类,替代原有xml中的配置

@Configuration
@ComponentScan
@PropertySource("classpath:jdbc.properties")
@Import(OtherConfig.class)
public class ApplicationContextConfig {}

@Primary注解用于标注相同类型的Bean优先被使用权,@Primary 是Spring3.0引入的,与@Component 和@Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过@Autowired根据类型进行注入时, 会选用优先级更高的。

注解 @Profile 标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活了当前环境,被标注的Bean才 能被注册到Spring容器里,不指定环境的Bean,任何环境下都能注册到Spring容器里。

可以使用以下两种方式指定被激活的环境:

使用命令行动态参数,虚拟机参数位置加载 -Dspring.profiles.active=test。

使用代码的方式设置环境变量 System.setProperty("spring.profiles.active","test")。

6.基于注解的aop开发

(1)AOP思想的实现方案:

动态代理技术,在运行期间,对目标对象 的方法进行增强,代理对象同名方法内可 以执行原有逻辑的同时嵌入执行其他增强 逻辑或其他对象的方法。

(2)AOP的相关概念

目标对象(Target):被增强的方法所在的对象。

代理对象(Proxy):对目标增强后的对象,客户端实际调用的对象。

连接点(JoinPoint):目标对象中可以被增强的方法。

切入点(Pointcut):目标对象中实际被增强的方法。

通知\增强(Advice):增强部分的代码逻辑。

切面(Aspect):增强方法和切入方法的组合。

织入(Weaving):将通知和切入点动态组合的过程。

(3)注解方式的aop开发

第一步:将通过的逻辑抽取到一个实现类中,交由spring容器进行管理,同时添加@Aspect注解。

第二步:定义通知方法,在通知方法中写入相应的增强逻辑。总共有五种通知类型的方法。分为前置通知,后置通知,环绕通知,异常通知,最终通知。详细如下 :

在通知方法中定义切入点,一般是某个包下的所有类。

第三步:如果核心配置使用的是配置类的话,需要配置注解方式的aop自动代理。如下:

@Configuration
@ComponentScan("com.itheima.aop")
@EnableAspectJAutoProxy //第三步
public class ApplicationContextConfig {
}

 (4)Spring底层动态代理生成对象的方式

jdk动态代理技术:目标类有接口,是基于接口动态生成实现类的代理对象,目标类有接口的情况下,默认使用此方式。

Cglib动态代理技术:目标类没有接口且不能使用final修饰,是基于被代理对象动态生成子对象为代理对象。目标类无接口时,默认使用该方式;目标类有接口时,手动配置<aop:config proxytarget-class=“true”>强制使用Cglib方式。

相关文章:

  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码
  • 大事务问题解决方案
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • Typora使用
  • ChatGPT自我分析
  • ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题
  • 固态硬盘需要分区吗 固态硬盘怎么分区
  • Linux:进程信号
  • 解决访问客户端位nat模式服务端syn握手失败的问题
  • 【Python】线程
  • 【markdown】markdown语法进阶
  • 自动驾驶自主避障概况
  • php mysql网络考试系统dzkf8994
  • python干饭神器---今天吃什么?python告诉你
  • 华为OD机试题【打折买水果】用 C++ 编码,速通
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2017 年终总结 —— 在路上
  • canvas 五子棋游戏
  • chrome扩展demo1-小时钟
  • Codepen 每日精选(2018-3-25)
  • cookie和session
  • create-react-app做的留言板
  • Facebook AccountKit 接入的坑点
  • JS数组方法汇总
  • orm2 中文文档 3.1 模型属性
  • SQLServer之索引简介
  • Vue UI框架库开发介绍
  • VuePress 静态网站生成
  • yii2中session跨域名的问题
  • 大数据与云计算学习:数据分析(二)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端_面试
  • 容器服务kubernetes弹性伸缩高级用法
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我从编程教室毕业
  • 小程序button引导用户授权
  • Android开发者必备:推荐一款助力开发的开源APP
  • 第二十章:异步和文件I/O.(二十三)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #1015 : KMP算法
  • #pragma once
  • #Z0458. 树的中心2
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (¥1011)-(一千零一拾一元整)输出
  • (LeetCode 49)Anagrams
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • ***检测工具之RKHunter AIDE
  • ***原理与防范
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Framework杂记