Spring框架总结
学习Spring的整体脉络:
1、IOC控制反转和依赖注入(XML配置和注解)
2、AOP面向切面编程
3、Spring使用JDBC
4、Spring的声明式事务控制
目录
- 前言
- 一、XML配置
- 二、Spring的JDBC
- 三、注解开发
- 四、Spring集成Junit
- 五、SpringAOP
- 1、JDK动态代理技术
- 2、cglib动态代理技术
- 3、AOP的相关概念
- 4、XML配置AOP详解
- 5、注解配置AOP详解
- 六、Spring的事务控制
- 结语
前言
Spring的简单介绍
Spring是轻量级的开源
框架,以IOC
和AOP
为内核
Spring的优势(了解):
1、方便解藕,简化开发
2、AOP编程支持
3、声明式事务支持
4、方便程序测试
5、方便集成各种优秀的框架
什么是IOC
IOC是指控制反转,是将对象的创建控制权交给Spring容器处理,而不是直接创建,实现IOC的方式有两种,一种是通过配置文件进行注入,另一种是通过注解的方式进行注入。
什么是AOP
AOP指的是面向切面编程,底层使用的是动态代理。Spring的AOP由JDK动态代理(针对接口)和cglib动态代理(针对类)这两个实现
pom.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Spring</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.5.RELEASE</version></dependency><!-- c3p0连接池 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><!-- druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><!-- Junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--Spring集成Junit导入的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.15.RELEASE</version></dependency><!--Spring的Aop依赖,推荐使用--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency><!--Spring集成Junit的依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>compile</scope></dependency><!--Spring的事务依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.11</version></dependency></dependencies>
</project>
一、XML配置
首先,我们先新建一个配置文件,名字可以随便取,但为了方便后面的阅读,建议名字和我一样:applicationContext.xml
创建的位置在resources
目录下
下面我先把约定的俗称列出,把下面内容复制到你的文件内容里,之后的内容都会用到!
<?xml version="1.0" encoding="UTF-8"?>
<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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"></beans>
如图:
接下来进入正题:
上面我们提到IOC是将类的创建交给容器,以下我们通过XML配置的方式使用,首先是定义一个实体类,然后在xml文件定义bean标签,然后填写对应的属性值
实体类:
//在com.entry包下新建一个实体类
package com.entry;
//新建实体类,类名为User
public class User {//设置属性private String name;//设置map域的属性private Map<String,String> map;//设置list域的属性private List<String> list;//设置数组域的属性private String array[]=new String[10];//设置Set无序集合的属性private Set<String> set;//有参和无参构造public User() {}public User(String name, String password, Map<String, String> map, List<String> list) {this.name = name;this.password = password;this.map = map;this.list = list;}//设置所有属性的get和set方法public String[] getArray() {return array;}public void setArray(String[] array) {this.array = array;}public Set<String> getSet() {return set;}public void setSet(Set<String> set) {this.set = set;}//设置构造函数public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public String getName() {return name;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public void setName(String name) {this.name = name;}
}
applicationContext.xml
配置文件
<!--在<beans>标签下写入一个新的<bean>标签 id是给bean设定唯一标识,class是指定User类的路径-->
<!--方式一、通过属性注入,scope指的是作用域,分为单例(默认),原型和request域和session域--><!--com.entry.User指的是com.entry包下的User类--><bean id="user" class="com.entry.User" scope="singleton"><!----><property name="name" value="小庄"/><!--对Map属性赋值--><property name="map"><map><entry key="name" value="小庄"/></map></property><!--对List赋值--><property name="list"><list><value>111</value><value>222</value></list></property><!--对Array数组赋值--><property name="a"><array><value>1</value><value>2</value></array></property><!--对Set集合注入--><property name="set"><set><value>1</value><value>2</value></set></property></bean>
<!--方式二、通过构造器注入--><bean id="user2" class="com.entry.User"><constructor-arg name="name" value="小庄"/><!--对list属性注入,name指的是属性名,value指的是属性值--><constructor-arg name="list"><list><value>111</value><value>222</value></list></constructor-arg><!--对map属性注入,key指的是键,value指的是值,在<entry>标签里--><constructor-arg name="map"><map><entry key="name" value="小庄"></entry></map></constructor-arg></bean>
测试:
import com.entry.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*** @Author:小庄*/
public class UserDemo {@Testpublic void test(){//获取上下文ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");User user = (User) app.getBean("user");System.out.println(user.getName());}
}
对相关标签的介绍
标签 | 作用 |
---|---|
<bean> | 用于定义一个类 |
<property> | 属性标识 |
<list> | 标识list的属性 |
<value> | 属性值 |
<map> | 标识map的属性 |
<entry> | map中的键值对标识 |
<constructor-arg> | 构造函数标签标识 |
<import> | 导入其他的Spring的分文件 |
属性的介绍
标签属性 | 作用 |
---|---|
id属性 | 在容器中Bean实例的唯一标识,不允许重复 |
class属性 | 要实例化的Bean的全限定名 |
scope属性 | Bean的作用范围,常用的是Singleton(默认)和prototype |
name属性 | 属性名称 |
value属性 | 属性值 |
ref属性 | 引用外部bean,类型需要跟属性名name保持一致,否则无法引用 |
二、Spring的JDBC
步骤:
1、导入mysql驱动的坐标,和数据池坐标,如果已经导入,则不需要导入
<!-- c3p0连接池 -->
<dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version>
</dependency>
<!-- druid连接池-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
<!--mysql驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version>
</dependency>
2、方式一:直接使用
@Test
public void test() throws PropertyVetoException, SQLException {//C3P0的连接池ComboPooledDataSource dataSource=new ComboPooledDataSource();//给连接池赋值dataSource.setDriverClass("com.mysql.jdbc.Driver");dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名");dataSource.setUser("数据库用户名");dataSource.setPassword("数据库用户密码");//获取连接Connection connection = dataSource.getConnection();//打印测试System.out.println(connection);//关闭连接connection.close();
}
3、方式二:使用xml直接配置
<!--数据源配置-->
<!--以下的class中的内容是c3p0依赖中的连接池类的路径-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/数据库名"/><property name="user" value="数据库用户名"/><property name="password" value="数据库用户密码"/>
</bean>
4、方式三:使用xml加外部文件配置
外部文件:
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
#端口号默认是3306
jdbc.url=jdbc:mysql://localhost:端口号/数据库名称
jdbc.user=数据库用户名
jdbc.password=数据库密码
xml配置
<!--在<beans>标签内部-->
<!--加载外部的properties-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--数据源配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/>
</bean><!--配置组件扫描,下面的意思是扫描com包下的所有文件--><context:component-scan base-package="com"/>
</beans>
具体使用
@Test
//测试Spring容器产生数据源对象
public void test4() throws Exception {//加载指定的xml文件ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");//获取数据源对象DataSource dataSource = app.getBean(DataSource.class);//获取连接Connection connection = dataSource.getConnection();System.out.println(connection);//关闭连接connection.close();
}
5、方式四:使用注解配置+外部文件配置
外部文件:
jdbc.properties
#数据库驱动
jdbc.driver=com.mysql.jdbc.Driver
#端口号默认是3306
jdbc.url=jdbc:mysql://localhost:端口号/数据库名称
jdbc.user=数据库用户名
jdbc.password=数据库密码
配置文件类
//配置文件核心注解
@Configuration
// <!--配置组件扫描,下面的意思是扫描com包下的所有文件-->
// <context:component-scan base-package="com"/>
@ComponentScan("com")
//<!--加载外部的properties-->
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.user}")private String user;@Value("${jdbc.password}")private String password;@Bean("dataSource")public DataSource getDataSource() throws Exception {ComboPooledDataSource dataSource=new ComboPooledDataSource();dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(user);dataSource.setPassword(password);return dataSource;}
}
具体使用
@Testpublic void test5() throws SQLException {ApplicationContext app=new AnnotationConfigApplicationContext(SpringConfig.class);DataSource dataSource = app.getBean(DataSource.class);Connection connection = dataSource.getConnection();//打印连接System.out.println(connection);connection.close();}
三、注解开发
原始注解:主要替代<brean>
配置
其中@Controller、@Service、@Repository这三个标签的作用和@Component一样,只是为了赋予了不同的语义化概念。
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在Web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用,用于根据名称进行依赖注入,按照id值从容器中进行匹配的 |
@Resource | 相当于@Autowired+@Qualifier ,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
步骤1:写入注解
步骤2:注册组件
,这样注解才能生效
也就是在xml配置文件添加以下代码
<!--配置组件扫描,下面的意思是扫描com包下的所有文件-->
<context:component-scan base-package="com"/>
如下代码:
新注解
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定Spring在初始化容器时要扫描的包。作用和在Spring的xml配置文件中的<context:component-scan base-package=“com”/>一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到Spring容器中 |
@PropertySource | 用于加载.properties文件中的配置 |
@import | 用于导入其他配置类 |
四、Spring集成Junit
1、导入spring集成Junit的坐标
<!-- Junit测试 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
<!--Spring集成Junit导入的依赖-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.15.RELEASE</version>
</dependency>
2、使用@Runwith
注解替换原来的运行期
@RunWith(SpringJUnit4ClassRunner.class)
3、使用@ContextConfiguration
指定配置文件或配置类
/**
配置文件方式,applicationContext.xml是自定义的配置文件,存放路径在resources
@ContextConfiguration("classpath:applicationContext.xml")
全注解的方式,SpringConfig.class是Java写的注解文件类
**/@ContextConfiguration(classes = {SpringConfig.class})
4、使用@Autowired
注入需要测试的对象
//使用Autowired注解将UserService注入
@Autowired
private UserService userService;
5、创建测试方法进行测试
//编写测试类,调用对象,查看是否可用
@Test
public void test(){userService.save();
}
五、SpringAOP
1、AOP的作用及其优势
作用:在程序运行期间,在不修改源代码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,并且便于维护
2、AOP的底层实现
通过Spring提供的动态代理技术实现的,在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
3、AOP的具体实现
- JDK代理:基于接口的动态代理技术
- cglib代理:基于父类的动态代理技术
1、JDK动态代理技术
jdk代理主要通过反射的方式进行代理,JDK代理本身就继承了Proxy类,由于Java不支持多继承,所以不支持对类的代理,只支持对接口的代理。
具体案例如下:
//接口1
interface IBoard {void draw();
}
//接口2
interface IComputer {void open();void complete();
}
//接口1的实现类
class Board implements IBoard{@Overridepublic void draw() {System.out.println("被代理类画画操作执行");}
}
//接口2的实现类
class Computer implements IComputer{@Overridepublic void open() {System.out.println("电脑正在启动...."); }@Overridepublic void complete() {System.out.println("电脑启动完成");}
}
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;class JDKProxy {//设置被代理对象private Object target;//通过构造函数设置被代理对象public JDKProxy(Object target) {this.target=target;}//被代理对象生成public Object getProxyInstance() {//返回一个JDK代理类对象return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("=================");System.out.println("代理开始");Object object=method.invoke(target, args);System.out.println("被代理的方法名:"+method.getName());if("open"==method.getName()) {Method complete=target.getClass().getMethod("complete");if(null!=complete){System.out.println("complete方法被代理对象自动调用");Thread.sleep(1000);complete.invoke(target, args);}}System.out.println("代理结束");System.out.println("=================");System.out.println();return object;}});}
}
//使用者
public class Client {public static void main(String[] args) {//代理画板对象JDKProxy board=new JDKProxy(new Board());IBoard iBoard=(IBoard)board.getProxyInstance();//调用画板的draw()方法iBoard.draw();//代理电脑对象JDKProxy computer=new JDKProxy(new Computer());IComputer iComputer=(IComputer) computer.getProxyInstance();//这里只调用了open()方法,但是complete会被代理对象自动调用iComputer.open();}
}
2、cglib动态代理技术
实现代理的关键:
- 创建工具类Enhancer
- 设置它的父类,会在虚拟机生成一个父类
- 设置回调函数
- 创建子类对象,作为代理对象
我们知道,使用Jdk代理的不足之处是不能对类进行代理,而Cglib代理刚好解决了这个问题。
Cglib可以对无接口的类进行代理,需要实现MethodInterceptor接口
具体案例:
//没有实现接口的类1
class Board{public void draw() {System.out.println("被代理类画画操作执行");}
}
//没有实现接口的类2
class Computer{public void open() {System.out.println("电脑正在启动....");}public void complete() {System.out.println("电脑启动完成"); }
}
//Cglib代理
import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//实现MethodInterceptor接口,重写intercept方法(实现代理功能)
class CglibProxy implements MethodInterceptor{//设置被代理类public Object target;//通过构造函数进行设置public CglibProxy(Object target) {this.target=target;}public Object getProxyInstance() {//创建工具类Enhancer e=new Enhancer();//设置父类e.setSuperclass(target.getClass());//设置回调函数e.setCallback(this);//创建子类对象,作为代理对象return e.create();}@Overridepublic Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {System.out.println("===============");//代理模式底层使用反射System.out.println("Cglib代理模式开始");//invoke激活,和jdk代理功能类似Object object=method.invoke(target, args);System.out.println("被代理的方法名:"+method.getName());//在代理类实现自己的功能if("open"==method.getName()) {Method complete=target.getClass().getMethod("complete");if(null!=complete){System.out.println("complete方法被代理对象自动调用");Thread.sleep(1000);complete.invoke(target, args);}}System.out.println("代理结束");System.out.println("=================");System.out.println();return object;}
}
另一种方式:不需要类去实现MethodInterceptor接口,是在回调函数的实现这个接口
//没有实现接口的类1
class Board{public void draw() {System.out.println("被代理类画画操作执行");}
}
//没有实现接口的类2
class Computer{public void open() {System.out.println("电脑正在启动....");}public void complete() {System.out.println("电脑启动完成"); }
}
//Cglib代理
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//实现MethodInterceptor接口,重写intercept方法(实现代理功能)
class CglibProxy2{//设置被代理类public Object target;//通过构造函数进行设置public CglibProxy2(Object target) {this.target=target;}public Object getProxyInstance() {//创建工具类Enhancer e=new Enhancer();//设置父类e.setSuperclass(target.getClass());//设置回调函数e.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object arg0, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("===============");//代理模式底层使用反射System.out.println("Cglib代理模式开始");//invoke激活,和jdk代理功能类似Object object=method.invoke(target, args);System.out.println("被代理的方法名:"+method.getName());//在代理类实现自己的功能if("open"==method.getName()) {Method complete=target.getClass().getMethod("complete");if(null!=complete){System.out.println("complete方法被代理对象自动调用");Thread.sleep(1000);complete.invoke(target, args);}}System.out.println("代理结束");System.out.println("=================");System.out.println();return object;}});//创建子类对象,作为代理对象return e.create();}
}
想看更多的设计模式请进:Java设计模式总结篇
3、AOP的相关概念
常用的术语如下:
- Target(目标对象):代理的目标对象
- Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
- Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在Spring中,这些点指的是方法类型的连接点
- Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
- Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知
- Aspect(切面):是切入点和通知(引介)的结合
- Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。Spring采用动态代理织入,而Aspect采用编译期织入和类装载期织入。
4、XML配置AOP详解
1、切入表达式的写法
表达式语法:
execution([修饰符] 返回值类型 包名.类名.方法名(参数类型))
- 访问修饰符可以省略
- 返回值类型、包名、类名、方法名可以使用星号
*
代表任意 - 包名与类名之间一个点
.
代表当前包下的类,两个点..
表示当前包及其子包下的类 - 参数列表可以使用两个点
..
表示任意个数、任意类型的参数列表
//method()指方法(切点),Target指类名(切面),com.aop值包名
execution(public void com.aop.Target.method())
//方式二,采用*号和一个.
execution(* com.aop.*.*())
//方式三,采用*号和一个.和两个. 比较常用
execution(* com..*.*(..))
//方式四 基本不会用上
execution(* *..*.(..))
2、通知种类
通知的配置语法:
<aop:通知类型 method="切面类中的方法" pointcut="切点表达式" />
名称 | 标签 | 说明 |
---|---|---|
前置通知 | <aop:before> | 用于配置前置通知,指定增强方法在切入点方法之前执行 |
后置通知 | <aop:after-returning> | 用于配置后置通知,指定增强方法在切入点方法之后执行 |
环绕通知 | <aop:around> | 用于配置环绕通知,指定增强方法在切入点方法之前和之后执行 |
异常抛出通知 | <aop:throwing> | 用于配置异常抛出通知,指定增强方法在出现异常时执行 |
最终通知 | <aop:after> | 用于配置最终通知,无论增强方法执行是否有异常都会执行 |
代码展示:
在com.aop包中新建一个MyAspect类,Target类和TargetInterface接口
package com.aop;
/*** @Author:小庄*/
//切面
public class MyAspect {//切点public void before(){System.out.println("前置增强");}public void afterRetuning(){System.out.println("后置增强");}
}
//接口
interface TargetInterface {public void save();
}
//目标方法
public class Target implements TargetInterface{public void save(){System.out.println("Save.........");}
}
在xml文件进行配置AOP
<!--先把bean注入Spring容器中-->
<bean id="target" class="com.aop.Target"/>
<bean id="myAspect" class="com.aop.MyAspect"/>
<!--aop配置开始-->
<aop:config>
<!-- <aop:pointcut id="myPointcut" expression="execution(* com..*.*(..))"/>--><!--配置切面--><aop:aspect ref="myAspect"><!--配置切点,method是方法名:pointcut切入点指定生效路径--><aop:before method="before" pointcut="execution(* com..*.*(..))"/></aop:aspect></aop:config>
使用Junit测试看看
import com.aop.TargetInterface;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @Author:小庄*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AopTest {@Autowiredprivate TargetInterface target;@Testpublic void test(){target.save();}
}
5、注解配置AOP详解
注解AOP开发步骤:
- 使用@Aspect标注切面类
- 使用@通知注解标注通知方法
- 在配置文件中配置aop自动代理
<aop:aspectj-autoproxy/>
让注解生效
通知注解的类型:
名称 | 标签 | 说明 |
---|---|---|
前置通知 | @Before | 用于配置前置通知,指定增强方法在切入点方法之前执行 |
后置通知 | @AfterReturning | 用于配置后置通知,指定增强方法在切入点方法之后执行 |
环绕通知 | @Around | 用于配置环绕通知,指定增强方法在切入点方法之前和之后执行 |
异常抛出通知 | @AfterThrowing | 用于配置异常抛出通知,指定增强方法在出现异常时执行 |
最终通知 | @After | 用于配置最终通知,无论增强方法执行是否有异常都会执行 |
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/*** @Author:小庄*/
@Component("myAspect")
@Aspect//告诉Spring容器Myspect是一个切面
public class MyAspect {@Before("execution(* com..*.*(..))")public void before(){System.out.println("前置增强");}@AfterReturningpublic void afterRetuning(){System.out.println("后置增强");}
}
六、Spring的事务控制
知识要点:
平台事务管理器配置
事务通知配置
事务aop的织入配置
基于xml的声明式事务控制
通过转账业务进行测试
xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--加载外部的properties--><context:property-placeholder location="classpath:jdbc.properties"/><!--数据源配置--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><!--jdbcTemplate注入--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><bean id="accountDao" class="com.dao.impl.AccountDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean><!--目标对象,内部的方法就是切点--><bean id="accountService" class="com.service.impl.AccountServiceImpl"><property name="accountDao" ref="accountDao"/></bean><!--选择jdbc数据源驱动--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--通知 事务的配置--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--name:切点方法名称isolation:事务隔离级别propagation:事务的传播行为timeout:超时时间read-only:是否只读--><tx:method name="transfer"/></tx:attributes></tx:advice><!--aop配置事务织入--><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.AccountServiceImpl.transfer(..))"/></aop:config>
</beans>
实体类
/*** @Author:小庄* 金额表实体类*/
public class Account {private String name;private double money;//设置方法public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}
}
Service层
转账业务接口
/*** @Author:小庄*/
public interface AccountService {public void transfer(String outMan,String inMan,double money);
}
Service的实现类
/*** @Author:小庄*/public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}@Transactionalpublic void transfer(String outMan, String inMan, double money) {//支出人,金额accountDao.out(outMan,money);//收款人,金额accountDao.in(inMan,money);}
}
Dao层
转账数据访问层接口
/*** @Author:小庄*/
public interface AccountDao {public void out(String outMan,double money);public void in(String inMan,double money);
}
Dao的实现类
/*** @Author:小庄*/
public class AccountDaoImpl implements AccountDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void out(String outMan, double money) {String sql="select money from account where name='"+outMan+"'";Integer sql_money = jdbcTemplate.queryForObject(sql, Integer.class);if (sql_money>=money){jdbcTemplate.update("update account set money=money-? where name=? ",money,outMan);}else {System.out.println("对不起!"+outMan+"。您的的金额不足,无法进行交易!");//退出程序System.exit(0);}}//存钱public void in(String inMan, double money) {jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);}
}
Controller层
/*** @Author:小庄*/
public class AccountController {public static void main(String[] args) {ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");AccountService accountService = app.getBean(AccountService.class);accountService.transfer("zhangsan","lisi",50);}
}
基于注解的声明式事务控制
1、使用@Transactional在需要进行事务控制的类或是方法上修饰,注解可用的属性同xml配置方式,例如隔离级别、传播行为等。
2、注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
3、使用在方法上,不同的方法可以采用不同的事务参数配置。
4、xml配置文件中要开启事务的注解驱动<tx:annotation-driven>
实现步骤如下:
修改xml配置文件(applicationContext)
<?xml version="1.0" encoding="UTF-8"?>
<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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--加载外部的properties--><context:property-placeholder location="classpath:jdbc.properties"/><!--组件扫描--><context:component-scan base-package="com" /><!--数据源配置--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!--选择jdbc事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--使得事务配置有效--><tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
修改Dao层的类(AccountDaoImpl 类)
/*** @Author:小庄*/
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;//取钱public void out(String outMan, double money) {//定义sql语句String sql="select money from account where name='"+outMan+"'";//执行sql语句Integer sql_money = jdbcTemplate.queryForObject(sql, Integer.class);//逻辑判断if (sql_money>=money){jdbcTemplate.update("update account set money=money-? where name=? ",money,outMan);}else {System.out.println("对不起!"+outMan+"。您的的金额不足,无法进行交易!");//退出程序System.exit(0);}}//存钱public void in(String inMan, double money) {jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);}
}
修改Service的类(AccountServiceImpl 类)
/*** @Author:小庄*/
@Service("accountService")
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;//可以加参数,可以把该注解放到类外头,表示统一的数据库参数配置@Transactional(isolation = Isolation.READ_COMMITTED)public void transfer(String outMan, String inMan, double money) {//支出人,金额accountDao.out(outMan,money);//收款人,金额accountDao.in(inMan,money);}
}
事务控制小结
使用xml的方式
首先需要配置通知事务的增强,然后配置事务织入,如:
<!--通知 事务的配置--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--name:切点方法名称isolation:事务隔离级别propagation:事务的传播行为timeout:超时时间read-only:是否只读--><tx:method name="transfer"/></tx:attributes></tx:advice><!--aop配置事务织入--><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.AccountServiceImpl.transfer(..))"/></aop:config>
使用注解的方式更加简单
只需要在需要声明事务的地方添加@Transactional
注解,并配置相关的参数和在xml配置文件中要开启事务的注解驱动<tx:annotation-driven manager="配置的事务管理器">
,开启组件扫描,
xml的配置,再加上@Transactional
<!--组件扫描:com表示包--><context:component-scan base-package="com" /><!--使得事务配置有效--><tx:annotation-driven transaction-manager="transactionManager"/>
结语
本篇文章是学习笔记,记录下来的方便之后的复习,如果有问题的请指出,不吝赐教。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- wireshark能抓到数据,调试工具却收不到数据问题
网上查找原因,有各种说法,其中有说关闭防火墙的,抱着试一试的心态,结果成功了。 wireshark有数据: 关闭防火墙: NetAssist收到数据:...
2024/4/19 14:41:37 - 《商务与经济统计》笔记第四章
《商务与经济统计》笔记第四章第四章:概率4.1 随机试验、计数法则、概率分配4.1.1 计数法则、组合和排列4.1.2 概率分配4.2 事件及其概率4.3 概率的基本性质4.4 条件概率4.4.1 独立事件4.4.2 乘法公式4.5 贝叶斯定理第四章:概率 4.1 随机试验、计数法则…...
2024/4/20 3:34:32 - 深入浅出java虚拟机,JVM学习初篇,java内存区域以及内存溢出问题
java程序在运行时会它会把它所管理的内存划分为多个区域,各有各的用途。下面我会一一解释这些比较重要的区域。 一,程序计数器 定义: (Program Counter Register)是一块较小的区域,它是线程私有的(即每个线程都有一个…...
2024/4/20 8:12:53 - 《商务与经济统计》笔记第三章
《商务与经济统计》笔记第三章第三章:描述统计学:数值方法3.1 位置的度量3.1.1 平均数、中位数、众数、3.1.2 百分位数、四分位数3.2 离散程度的度量3.2.1 极差、四分位数间距、方差、标准差、标准差系数3.3 分布形态、相对位置的度量、异常值的检测3.3.…...
2024/4/26 9:59:17 - 记一次DM8 Manager管理工具启动异常问题
环境:CentOS7.3 64位 DM8数据库 首先按照官网要求安装完数据库,一开始还可以正常打开管理工具,过了一段时间后发现用dmdba登录manager管理工具异常,具体如下截图: 具体报错内容如下: [dmdbalocalhost to…...
2024/4/25 23:02:10 - Promise对象
1.回调函数 1.什么是回调函数 回调函数,异步执行顺序中,某个函数执行得到数据之后回头调用的函数 2.回调函数的基本语法 function fn(callback) {//异步执行过程//延时获取数据dat//执行回调函数,处理获取的数据callback(dat) }3.回调函数的…...
2024/4/26 10:43:40 - (2)HTML基本标签
一、认识纯文本格式 1.什么是纯文本格式? 纯文本格式,就是没有任何文本修饰的,没有任何粗体,下划线,斜体,图形,符号或特殊字符及特殊打印格式的文本,只保存文本,不保存…...
2024/4/15 3:32:18 - 《商务与经济统计》笔记第六章
《商务与经济统计》笔记第六章连续型概率分布6.1 均匀概率分布6.2 正态概率分布6.2.1 正态曲线6.2.2 标准正态概率分布6.2.3 计算正态分布的概率6.3 二项概率的正态近似6.4 指数概率分布6.4.1 计算指数分布的概率6.4.2 泊松分布和指数分布的关系连续型概率分布 重要的三种连续…...
2024/4/19 0:54:37 - javaBean实现简单计数器
计数器这个功能是为了统计本网站的访客数量,很多网站都有这个功能.一样,贴上一个简单计数器的代码,大家研究文件名:Counter.javapackage beans;public class Counter {// 定义计数器变量private long counter;// 取出计数器的值public long getCounter() {return counter;}// 对…...
2024/4/7 16:27:12 - vue 移动端 学习总结
1. 适配问题 libflexible 和 postCss-px2 Rem 配合实现适配 rem // 1. 安装 lib-flexible npm install lib-flexible --save-dev// 2. 引入 lib-flexible 在 main.js 中导入 import lib-flexible// 3. 在 index.html 中引入 flexible.js 的 cdn <script src"http://g…...
2024/4/15 3:32:08 - Kibana 操作 ES+搜索
一.使用 Kibana 操作 ES 下载 Kibana 镜像 docker pull kibana:7.9.3启动 Kibana 容器 docker run \ -d \ --name kibana \ --net es-net \ -p 5601:5601 \ -e ELASTICSEARCH_HOSTS["http://node1:9200","http://node2:9200","http://node3:9200&q…...
2024/4/25 15:46:58 - 21天好习惯第一期—13
Codeforces 日常切题 1.A. Linear Keyboard 题解:给你一个重新排列好的26位字母,计算后一个字符距离前一个字符的距离,两重循环暴力就可以了。 AC代码如下: #include <bits/stdc.h> using namespace std; int main() {i…...
2024/4/24 9:00:59 - AUTOSAR中CAN通信栈简介(二)
4. PduR简介 ➢PDU Router主要为通讯接口模块(CANIF) 、传输协议模块(CAN TP、J1939TP)、诊断通讯管理模块(DOI、 J1939DCM)以及通讯模块(COM、LDCOM) 以及IPDUM、SEC0C等 模转提供基于1 -PDU的路由服务。 4.1 PduR功能 ➢PDUR状态管理 ➢Routing Table路由表 ➢I-PDU的路…...
2024/4/20 11:47:34 - 线性回归【机器学习笔记简摘】
定义与公式 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。 通用公式:h(w)w1x1w2x2w3x3...bwTxbh(w)w_1x_1w_2x_2w_3x_3...bw^Txbh(w)w1x1w2x2w3x3...bwTxb 线性回归…...
2024/4/26 5:53:46 - websocket 接口如何测试?
什么是 websocket 接口? 使用 websocket 建立长连接,服务端和客户端可以互相通信,服务端只要有数据更新,就可以主动推给客户端。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推…...
2024/4/20 6:19:00 - CentOS 安装 Docker
准备工作 系统要求 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。 CentOS 7 满足最低 内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并 且部分功能可…...
2024/4/25 20:01:59 - 29 | 如何判断一个数据库是不是出问题了?
MySQL45讲 实践篇 29 | 如何判断一个数据库是不是出问题了? select 1 判断 select 1 成功返回,只能说明这个库的进程还在,并不能说明主库没问题。 set global innodb_thread_concurrency3; # 控制 InnoDB 的并发线程上限CREATE TABLE t…...
2024/4/20 2:39:45 - hive的压缩存储格式
1、5种存储格式 Apache Hive支持Apache Hadoop中使用的几种熟悉的文件格式,如TextFile,RCFile,SequenceFile,AVRO,ORC和Parquet格式。 Cloudera Impala也支持这些文件格式。 在建表时使用STORED AS (TextFile|RCFil…...
2024/4/24 16:07:27 - PHP底层原理以及代码执行过程
PHP的底层原理 从图上可以看出,php从下到上是一个4层体系 Zend引擎 Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行 opcode的处理并实现相应的处理方法、实现了基本的数…...
2024/4/26 16:36:36 - BIT-0程序环境和预编译 c语言预处理
1.程序的翻译环境 2.程序的执行环境 3.c语言程序的编译链接 4.预定义符号介绍 5.预处理指令#define 6.宏和函数的对比 7.预处理操作符#和##的介绍 8.命令定义 9.预处理指令#include 10.预处理指令#undef 11.条件编译 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&…...
2024/4/25 5:24:11
最新文章
- 【第23章】spring-async(异步)
文章目录 前言一、业务类1. controller2. service3. dao 二、核心配置1.配置类2.测试类3.测试结果 总结 前言 在原生Java中,我们想要实现异步需要新建线程或线程池提交任务的方式,spring提供了一种基于注解的方式实现异步。 一、业务类 1. controller package or…...
2024/4/26 19:57:47 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - audio_video_img图片音视频异步可视化加载
最近在做即时消息,消息类型除了文字还有音频、视频、图片展示,如果消息很多,在切换聊天框时,会有明显卡顿,后续做了懒加载,方案是只加载用户能看到的资源,看不到的先不加载; LazyAud…...
2024/4/22 22:35:28 - docker进行jenkins接口自动化测试持续集成实战
文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk,maven,git,allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…...
2024/4/21 18:28:02 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/25 18:39:24 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/25 18:38:39 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/25 18:39:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/25 18:39:22 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/25 18:39:20 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/25 16:48:44 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/26 16:00:35 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/25 18:39:12 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/25 18:38:58 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/25 18:38:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57