Spring学习笔记——AOP(4)
一、学习AOP
1.1 AOP的概述
1.2 AOP思想实现方案
1.3、模拟AOP的基础代码
1.4、AOP的相关概念
二、基于xml配置AOP
2.1 AOP基础入门
2.2、XML方式AOP配置详解
2.3、XML方式AOP原理剖析
三、注解式开发AOP
3.1 注解式开发AOP入门
3.2 AOP注解详细介绍
3.3、注解方式AOP原理解析
四、基于AOP的声明式事务控制
4.1 Spring事务编程概述
4.2 搭建测试环境
4.3 基于XML声明式事务控制
4.4 注解声明式事务控制
一、学习AOP
1.1 AOP的概述
AOP---->面向切面编程
是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性
、方法与方法
、对象与对象
都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程
1.2 AOP思想实现方案
代理技术: 动态代理技术,在运行期间,对目标方法进行增强,代理对象同名方法内执行原有逻辑或方法的同时可以执行其他的增强逻辑,或者其他对象的方法
1.3、模拟AOP的基础代码
其实在之前学习BeanPostProcessor时,在BeanPostProcessor
的after方法
中使用动态代理对Bean进行了增强,实际存储到单例池singleObjects中的不是当前目标对象本身,而是当前目标对象的代理对象Proxy
,这样在调用目标对象方法时,实际调用的是代理对象Proxy的同名方法,起到了目标方法前后都进行增强的功能,对该方式进行一下优化,将增强的方法提取出去到一个增强类中,且只对com.itheima.service.impl
包下的任何类的任何方法进行增强
pubiic class MyAdvice {
public void beforeAdvice ( ) {
system. out. println ( "beforeAdvice..." ) ;
)
public void afterAdvice ( ) {
System . out. println ( "afterAdvice..." ) ;
}
}
public class MockAopBeanPostProcessor implements BeanPostProcessor , ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public Object postProcessAfterInitialization ( Object bean, String beanName) throws BeansException {
if ( bean. getClass ( ) . getPackage ( ) . getName ( ) . equals ( "com.Smulll.service.Impl" ) ) {
Object beanProxy = Proxy . newProxyInstance (
bean. getClass ( ) . getClassLoader ( ) ,
bean. getClass ( ) . getInterfaces ( ) ,
( Object proxy, Method method, Object [ ] args) -> {
Myadvice myadvice = applicationContext. getBean ( Myadvice . class ) ;
myadvice. before ( ) ;
Object invoke = method. invoke ( bean, args) ;
myadvice. after ( ) ;
return invoke;
} ) ;
return beanProxy;
}
return null ;
}
@Override
public void setApplicationContext ( ApplicationContext applicationContext) throws BeansException {
this . applicationContext = applicationContext;
}
}
1.4、AOP的相关概念
概念
单词
解释
目标对象
Target
被增强的方法所在的对象
代理对象
Proxy
对目标对象进行增强后的对象,客户端实际调用的对象
连接点
Joinpoint
目标对象中可以被增强的方法
切入点
Pointcut
目标对象中实际被增强的方法
通知\增强
Advice
增强部分的代码逻辑
切面
Aspect
增强和切入点的组合
织入
Weaving
将通知和切入点组合动态组合的过程
二、基于xml配置AOP
2.1 AOP基础入门
基本步骤:
导入AOP相关坐标;
< dependency>
< groupId> org.aspectj groupId>
< artifactId> aspectjweaver artifactId>
< version> 1.9.6 version>
dependency>
准备目标类、准备通知类,并配置给Spring管理;
配置切点表达式(哪些方法被增强);
配置织入(切点被哪些通知方法增强,是前置增强还是后置增强)。
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xmlns: aop= " http://www.springframework.org/schema/aop"
xsi: schemaLocation= "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
" >
< bean id = " userService" class = " com.huanglei.service.Impl.UserServiceImpl" > bean>
< bean id = " myadvice" class = " com.huanglei.advice.Myadvice" > bean>
< aop: config>
< aop: pointcut id = " mtPointcut" expression = " execution(void com.Smulll.service.Impl.UserServiceImpl.show1())" />
< aop: aspect ref = " myadvice" >
< aop: before method = " before" pointcut-ref = " mtPointcut" > aop: before>
< aop: after method = " after" pointcut-ref = " mtPointcut" > aop: after>
aop: aspect>
aop: config>
beans>
2.2、XML方式AOP配置详解
xml配置AOP的方式还是比较简单的,下面看一下AOP详细配置的细节:
< ! -- 配置aop-- >
< aop: config>
< ! -- 配置切点表达式 目的:指定哪些方法被增强-- >
< aop: pointcut id= "mtPointcut" expression= "execution(void com.huanglei.service.Impl.UserServiceImpl.show1())" / >
< aop: pointcut id= "mtPointcut2" expression= "execution(void com.huanglei.service.Impl.UserServiceImpl.show2())" / >
< / aop: config>
pointcut属性可以再后面直接写上要结合的切点
< ! -- 配置aop-- >
< aop: config>
< ! -- 配置切点表达式 目的:指定哪些方法被增强-- >
< aop: pointcut id= "mtPointcut" expression= "execution(void com.huanglei.service.Impl.UserServiceImpl.show1())" / >
< ! -- 配置织入 目的:指定哪些切点与哪些通知结合-- >
< aop: aspect ref= "myadvice" >
< aop: before method= "before" pointcut- ref= "mtPointcut" > < / aop: before>
< aop: after method= "after" pointcut= "execution(void com.huanglei.service.Impl.UserServiceImpl.show1())" > < / aop: after>
< / aop: aspect>
< / aop: config>
切点表达式的配置语法
execution ( [ 访问修饰符] 返回值类型 包名. 类名. 方法名( 参数) )
详解:
访问修饰符可以省略不写;
返回值类型、某一级包名、类名、方法名可以使用*表示任意;
包名与类名之间使用单点.表示该包下的类,使用双点…表示该包及其子包下的类;
参数列表可以使用两个点…表示任意参数。
常见的切点表达式:
execution ( public void com. itheima. aop. TargetImpl. show ( ) )
execution ( * com. itheima. aop. TargetImpl. *( . . ) )
execution ( * com. itheima. aop. *. *( . . ) )
execution ( * com. itheima. aop. . *. *( . . ) )
execution ( * * . . *. *( . . ) )
通知名称
配置方式
执行时机
前置通知
目标方法执行之前执行
后置通知
目标方法执行之后执行,目标方法异常时,不在执行
环绕通知
目标方法执行前后执行,目标方法异常时,环绕后方法不在执行
异常通知
目标方法抛出异常时执行
最终通知
不管目标方法是否有异常,最终都会执行
通知方法再被调用时,Spring可以为其传递一些必要的参数
参数类型
作用
JoinPoint
连接点对象,任何通知都可使用,可以获得当前目标对象、目标方法参数等信息
ProceedingJoinPoint
JoinPoint子类对象,主要是在环绕通知中执行proceed(),进而执行目标方法
Throwable
异常对象,使用在异常通知中,需要在配置文件中指出异常对象名称
public void 通知方法名称( JoinPoint joinPoint) {
system. out. println ( joinPoint. getArgs ( ) ) ;
system. out. println ( joinPoint. getTarget ( ) ) ;
System . out. println ( joinPoint. getstaticPart ( ) ) ;
}
Throwable对象
public void afterThrowing ( JoinPoint joinPoint, Throwable th) {
System . out. println ( "异常对象是:" + th+ "异常信息是:" + th. getMessage ( ) ) ;
}
< aop: after- throwing method= "afterThrowing" pointcut- ref= "myPointcut" throwing= "th" / >
spring定义了一个Advice接口,实现了该接口的类都可以作为通知类出现
public interface Advice {
}
2.3、XML方式AOP原理剖析
动态代理的实现的选择,在调用getProxy()方法时,我们可选用的AopProxy接口有两个实现类,如上图,这两种都是动态生成代理对象的方式,一种就是基于JDK的,一种是基于Cglib的
代理技术
使用条件
配置方式
JDK动态代理技术
目标类有接口,是基于接口动态生成实现类的代理对象
目标类有接口的情况下,默认方式
Cglib 动态代理技术
目标类无接口且不能使用final修饰,是基于被代理对象动态生成子对象为代理对象
目标类无接口时,默认使用该方式;目标类有接口时,手动配置
Target target = new Target ( ) ;
Advices advices = new Advices ( ) ;
Enhancer enhancer = new Enhancer ( ) ;
enhancer. setSuperclass ( Target . class ) ;
enhancer. setCallback ( ( MethodInterceptor ) ( o, method, objects, methodProxy) -> {
advices. before ( ) ;
object result = method. invoke ( target, objects) ;
advices. afterReturning ( ) ;
return result;
} ) ;
Target tagetProxy = ( Target ) enhancer. create ( ) ;
String result = targetProxy. show ( "haohao" ) ;
三、注解式开发AOP
3.1 注解式开发AOP入门
Spring的AOP也提供了注解方式配置,使用相应的注解替代之前的xml配置,xml配置AOP时,我们主要配置了三部分:目标类被Spring容器管理、通知类被Spring管理、通知与切点的织入(切面),如下:
< bean id = " target" class = " com.itheima.aop.TargetImpl" > bean>
< bean id = " advices" class = " com.itheima.aop.Advices" > bean>
< aop: config proxy-target-class = " true" >
< aop: aspect ref = " advices" >
< aop: around method = " around" pointeut = " execution(* com.itheima.aop.*.*(..))" />
aop: aspect>
aop: config>
配置aop,其实配置aop主要就是配置通知类中的哪个方法(通知类型)对应的切点表达式是什么:
注解@Aspect、@Around需要被Spring解析,所以在Spring核心配置文件中需要在配置文件当中添加的自动代理
< aop: aspectj-autoproxy>
3.2 AOP注解详细介绍
通过不同的注解去完成各项通知类型:
@Before ( "execution( *com. itheima.aop.*.*(..))" )
public void before ( JoinPoint joinPoint) { }
@AfterReturning ( "execution(* com.itheima.aop.*.*(..))" )
public void afterReturning ( JoinPoint joinPoint) { }
@Around ( "execution (* com.itheima.aop.*.*(..))" )
public void around ( ProceedingJoinPoint joinPoint) throws Throwable { }
@AfterThrowing ( "execution(* com.itheima.aop.*.*(..))" )
public void afterThrowing ( JoinPoint joinPoint) { }
@After ( "execution(* com.itheima.aop.*.*(..))" )
public void after ( JoinPoint joinPoint) { }
3.3、注解方式AOP原理解析
之前在使用xml配置AOP时,是借助的Spring的外部命名空间的加载方式完成的,使用注解配置后,就抛弃了标签,而该标签最终加载了名为AspectJAwareAdvisorAutoProxyCreator的BeanPostProcessor ,最终,在该BeanPostProcessor中完成了代理对象的生成。
同样,从aspectj-autoproxy标签的解析器入手
this . registerBeanDefinitionParser ( "aspectj-autoproxy" , new AspectJAutoProxyBeanDefinitionParser ( ) ) ;
四、基于AOP的声明式事务控制
4.1 Spring事务编程概述
事务在开发的时候是必不可少的东西,在使用JDBC开发的时候,我们使用的是connection
对事物进行控制,使用Mybatis时,我们使用的时SqlSession对事物进行控制,缺点显而易见,我们在切换数据库访问技术的时候,事务控制的方式就会总是在改变,Spring就在这些技术的基础上,提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制
和声明式事务控制
事务控制的方式
解释
编程式事务控制
Spring提供了事务控制的类和方法,使用编码的方式对业务代码进行了事务控制,事务控制的代码和业务操作代码耦合在一起,在开发当中很少使用
声明式事务控制
Spring提供了事务控制的封装,对外提供了xml配置和注解式开发的配置方式,可以通过配置的方式完成对事物的控制,可以达到事务控制和业务操作代码的解耦合,在开发当中推荐使用
Spring事务编程相关的类:
事务控制相关的类
解释
平台事务管理器 PlatformTransactionManager
是一个接口标准,实现类都具备事务提交、回滚和获得事务对象的功能,不同持久层框架可能会有不同实现方案
事务定义 TransactionDefinition
封装事务的隔离级别、传播行为、过期时间等属性信息
事务状态 TransactionStatus
存储当前事务的状态信息,如果事务是否提交、是否回滚、是否有回滚点等
虽然我们在开发当中不怎么使用这个编程式事务控制,但是对于这个编程式事务控制的相关类我们需要了解一下,因为我们在进行声明式配置的时候我们还会看见他们
4.2 搭建测试环境
搭建一个转账的环境,dao层一个转出钱的方法,一个转入钱的方法service层一个转账业务方法,内部分别调 用dao层转出钱和转入钱的方法,准备工作如下:
数据库准备一个账户表tb_account;
dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法;
service层准备一个transferMoney方法,分别调用incrMoney和decrMoney方法;
在applicationContext文件中进行Bean的管理配置;
测试正常转账与异常转账。
xml配置:
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xmlns: cotext= " http://www.springframework.org/schema/context"
xmlns: aop= " http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
" >
< cotext: component-scan base-package = " com.huanglei" />
< cotext: property-placeholder location = " classpath:jdbc.properties" />
< bean id = " dataSource" class = " com.alibaba.druid.pool.DruidDataSource" >
< property name = " driverClassName" value = " ${jdbc.driver}" />
< property name = " url" value = " ${jdbc.url}" />
< property name = " username" value = " ${jdbc.username}" />
< property name = " password" value = " ${jdbc.password}" />
bean>
< bean class = " org.mybatis.spring.SqlSessionFactoryBean" >
< property name = " dataSource" ref = " dataSource" > property>
bean>
< bean class = " org.mybatis.spring.mapper.MapperScannerConfigurer" >
< property name = " basePackage" value = " com.huanglei.mapper" > property>
bean>
beans>
Mapper映射文件
public interface accountMapper {
@Update ( "update tb_account set money = money+#{money} where account_name = #{accountName}" )
public void incrMoney ( @Param ( "accountName" ) String accountName, @Param ( "money" ) Double money) ;
@Update ( "update tb_account set money = money-#{money} where account_name = #{accountName}" )
public void decrMoney ( @Param ( "accountName" ) String accountName, @Param ( "money" ) Double money) ;
}
service代码:
@Service ( "accountService" )
public class AccountServiceImpl implements AccountService {
@Autowired
private accountMapper accountMapper;
public void transferMoney ( String outAccount, String inAccount, Double money) {
accountMapper. decrMoney ( outAccount, money) ;
accountMapper. incrMoney ( inAccount, money) ;
}
}
4.3 基于XML声明式事务控制
结合我们学过的AOP技术,我们可以使用AOP对service的方法进行事务增强。
目标类:自定义的AccountServicelmpl,内部的方法是切点
通知类: Spring提供的,通知方法已经定义好,只需要配置即可
通知类是Spring提供的,需要导入Spring事务的相关的坐标;
配置目标类AccountServicelmpl;
使用advisor标签配置切面。
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xmlns: cotext= " 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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
" >
< cotext: component-scan base-package = " com.huanglei" />
< cotext: property-placeholder location = " classpath:jdbc.properties" />
< bean id = " dataSource" class = " com.alibaba.druid.pool.DruidDataSource" >
< property name = " driverClassName" value = " ${jdbc.driver}" />
< property name = " url" value = " ${jdbc.url}" />
< property name = " username" value = " ${jdbc.username}" />
< property name = " password" value = " ${jdbc.password}" />
bean>
< bean class = " org.mybatis.spring.SqlSessionFactoryBean" >
< property name = " dataSource" ref = " dataSource" > property>
bean>
< bean class = " org.mybatis.spring.mapper.MapperScannerConfigurer" >
< property name = " basePackage" value = " com.huanglei.mapper" > property>
bean>
< bean id = " transactionManager" class = " org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name = " dataSource" ref = " dataSource" />
bean>
< tx: advice id = " txAdvice" transaction-manager = " transactionManager" >
< tx: attributes>
< tx: method name = " *" />
tx: attributes>
tx: advice>
< aop: config>
< aop: pointcut id = " txPointcut" expression = " execution(* com.Smulll.service.Impl.*.*(..))" />
< aop: advisor advice-ref = " txAdvice" pointcut-ref = " txPointcut" />
aop: config>
beans>
< tx: advice id = " txAdvice" transaction-manager = " transactionManager" >
< tx: attributes>
< tx: method name = " *" isolation = " READ_COMMITTED" propagation = " " timeout = " 3" read-only = " false" />
tx: attributes>
tx: advice>
**isolation属性:**指定了事务的隔离级别,事务并发存在三大问题:脏读,不可重复读,幻读/虚度
。可以通过设置事务的隔离级别来保证并发问题的实现,常用的是READ_COMMITTED和REPEATABLE_READ
常见的isolation设置:
isolation属性
解释
DEFAULT
表示的为默认的隔离级别,这个取决于你使用的哪种数据库,如MySQL就是REPEATABLE_READ
READ_UNCOMMITTED
A事务可以读取到B事务尚未提交的事务记录,不能解决任何并发问题,安全性最低,性能最高
READ_COMMITTED
A事务只能读取到其他事务已经提交的记录,不能读取到未提交的记录。可以解决脏读问题,但是不能解决不可重复读和幻读
REPEATABLE_READ
A事务多次从数据库读取某条记录结果一致,可以解决不可重复读,不可以解决幻读
SERIALIZABLE
串行化,可以解决任何并发问题,安全性最高,但是性能最低
**read-only属性:**就是设置当前的状态,为只读还是可以修改。设置为true表示只读,那么这样可以提高查询的性能,如果要增加或者删除修改,那必须得设置为法false
< tx: method name = " select*" read-only = " true" />
< tx: method name = " find*" read-only = " false" />
**timeout属性:**设置事务提交的最长时间,如果超过这个时间那么事务就会自动回滚,不再执行。默认值为-1,表示没有时间限制。
< tx: method name = " select*" read-only = " true" timeout = " 3" />
propagation属性 :设置事务的传播行为,主要解决是A方法调用B方法时,事务的传播方式问题的,例如:使用单方的事务,还是A和B都使用自己的事务等。事务的传播行为有如下七种属性值可配置
事务传播的行为
解释
REQUIRED (默认值)
A调用B,B需要事务,如果A有事务B就加入A的事务中,如果A没有事务,B就自己创建一个事务
REQUIRED_NEW
A调用B,B需要新事务,如果A有事务就挂起,B自己创建一个新的事务
SUPPORTS
A调用B,B有无事务无所谓,A有事务就加入到A事务中,A无事务B就以非事务方式执行
NOT_SUPPORTS
A调用B,B有无事务无所谓,A有事务就加入到A事务中,A无事务B就以非事务方式执行
NEVER
A调用B,B以无事务方式执行,A如有事务则抛出异常
MANDATORY
A调用B,B要加入A的事务中,如果A无事务就抛出异常
NESTED
A调用B, B创建一个新事务,A有事务就作为嵌套事务存在,A没事务就以创建的新事务执行
4.4 注解声明式事务控制
@Configuration
@ComponentScan ( "com.huanglei" )
@PropertySource ( "classpath:jdbc.properties" )
@MapperScan ( "com.huanglei.mapper" )
@EnableTransactionManagement
public class SpringConfig {
@Bean
public DataSource dataSource (
@Value ( "${jdbc.driver}" ) String driver,
@Value ( "${jdbc.url}" ) String url,
@Value ( "${jdbc.username}" ) String username,
@Value ( "${jdbc.password}" ) String password
) {
DruidDataSource dataSource = new DruidDataSource ( ) ;
dataSource. setDriverClassName ( driver) ;
dataSource. setUrl ( url) ;
dataSource. setUsername ( username) ;
dataSource. setPassword ( password) ;
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean ( DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean ( ) ;
sqlSessionFactoryBean. setDataSource ( dataSource) ;
return sqlSessionFactoryBean;
}
@Bean
public DataSourceTransactionManager transactionManager ( DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager ( ) ;
dataSourceTransactionManager. setDataSource ( dataSource) ;
return dataSourceTransactionManager;
}
}
你可能感兴趣的:(Spring,spring,学习,笔记,后端)
x86-64汇编语言训练程序与实战
十除以十等于一
本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层
三菱PLC全套学习资料及应用手册
good2know
本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
日更006 终极训练营day3
懒cici
人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
《极简思维》第三部分
小洋苏兮
整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别
你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。
霖霖z
打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪
SpringMVC执行流程(原理),通俗易懂
国服冰
SpringMVC spring mvc
SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提
贫穷家庭的孩子考上985以后会怎样?
Mellisa蜜思言
我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我
Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
倾听铃的声
后端 spring java mvc 开发语言 分布式
前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet处理请求的过程的源码解析。本文是第二篇:DispatcherServlet处理请求的过程的源码解析。@pdaiSpring进阶-SpringMVC实现原理之DispatcherServlet处理请求的
2019-06-05
第十七把巴鲁克
今天去实验田里实习,见到了福寿螺真的可怕且牛皮,六级也快来了,说实话还是害怕。我昨天考了环工原理,真的太难了,太烦了,理工科真的难,烦。实验报告还是没写,要抓紧速度抓紧时间,还是应该学会努力学习,远离一些不上进的事物。
Flowable 高级扩展:自定义元素与性能优化实战
练习时长两年半的程序员小胡
Flowable 流程引擎实战指南 流程图 flowable BPMN 流程引擎 java
在前五篇文章中,我们从基础概念、流程设计、API实战、SpringBoot集成,到外部系统协同,逐步构建了Flowable的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求——比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦Flowable的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。一、自定
SpringMVC的执行流程
1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,
2018-09-27 aop相关
蒋超_58dc
1.静态织入,需要使用aspectj专用的compilermaven工程可以采用:https://www.mojohaus.org/aspectj-maven-plugin/2.动态织入,配合spring,创建代理来执行3.
为什么焦虑、抑郁、自残的青少年越来越多?
精神健康
很多家长觉得没缺孩子吃的穿的,他们有安稳的生活,他们有什么可焦虑、抑郁的,但现在的孩子,学习压力越来越大,每天休息的时间越来越少,出现焦虑抑郁是很正常的。从发展的角度看,青少年时期,人的身体、情绪,智力、人格都急剧发展,正从未成熟走向成熟,情绪起伏不定,易冲动,再者,由于缺乏生活经验,以及来自于家长、学校、社会的各种要求和压力,从而不知所措,心中的焦虑、恐惧、彷徨得不到及时的排解,从而导致心理上的
读书打卡《别想太多啦》
chenchen_68ed
第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自
2023-01-26
胡喜平
我觉得《可见的学习》一书确实从底层逻辑说清楚了,教学的本质。可是太多术语和概念,一时间难以消化啊。而且知道和懂得有距离,运用就更不行了,需要高手和专家的指导。我需要多听听新课标的讲座了,来反复印证。读论文也有了一点点灵感,明天修改我的论文。
平静得接受自己的笨拙 20190118 晨间日记
吴伯符
图片发自App最近做了一个关于微习惯的分享,这里有八个字:微量开始,超额完成。这里的言下之意其实是要你在一开始的时候,平静地接受自己的笨拙。接受自己的笨拙,理解自己的笨拙,放慢速度尝试,观察哪里可以改进,再反复练习,观察自己哪里可以再进一步改进,再反复…这是学习一切技能的必须的过程。这里的两个关键点是:1.尽快的开始这个过程,这就能够用到微习惯的微量开始。2.尽快的度过这个过程,这就需要用到超额完
【花了N长时间读《过犹不及》,不断练习,可以越通透】
君君Love
我已经记不清花了多长时间去读《过犹不及》,读书笔记都写了42页,这算是读得特别精细的了。是一本难得的好书,虽然书中很多内容和圣经吻合,我不是基督徒,却觉得这样的文字值得细细品味,和我们的生活息息相关。我是个界线建立不牢固的人,常常愧疚,常常害怕他人的愤怒,常常不懂拒绝,还有很多时候表达不了自己真实的感受,心里在说不嘴里却在说好……这本书给我很多的启示,让我学会了怎样去建立属于自己的清晰的界限。建立
二十四节气组诗 谷雨
离陌_6639
图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之
你好,2020年
瑄瑄妍妍的妈咪
早上好,今天是2020年的第一天,也就是元旦,新年新的一天开始了。新的开始,重新规划未来的一年。从今天开始,用了一个新的记账软件,之前的随手记软件,也没有删除,只是重新下载了一个别的软件,开始一个新的记账旅程,对于理财开支,有个新的规划。通过小红书视频软件,学习了不少育儿知识,和各种不同的美食,以后动手制作,给宝宝做健康美味的营养餐。学习方面,继续学英语吧!虽然是抽出时间学的,进度也比较慢,但是积
基于redis的Zset实现作者的轻量级排名
周童學
Java redis 数据库 缓存
基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的
常规笔记本和加固笔记本的区别
luchengtech
电脑 三防笔记本 加固计算机 加固笔记本
在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输
《云襄传》:云襄做的局是浑水摸鱼吗?
书生号贺
云襄入南都是要浑水摸鱼吗?他是云台的高材生吗?他为啥笃定师父一定会让他留在南都?他为啥觉得他能够做局成功?他是在经商吗?还是在经营人心与欲望?云襄是云台弟子,云台属千门的一支,另一支叫凌渊,云台教人经商之道,重智慧,凌渊以武力取胜,但倍受打压。云襄学习十五年,下高山奔越州,途经南洋,因恩人闻聪被害,囚于白驹镇,念于情分,被卷入这样一个局面里,结识了舒亚南与金十两,于是,复仇小组成立,目标是南都漕帮
心力践行营十二期一阶学习打卡
LX_王彤彤
姓名:王彤彤时间:2021年4月24日一:朗读师父的十大人生哲学二:师父的早安分享感悟很喜欢这句话:所有的行动都是基于目标的尝试,没有所谓的失败,只是不同尝试后得到的不同结果,让我们更好地调整下一次的行动。三:感恩日记1.我太幸福了,我很感恩姑姑,因为姑姑放假又投喂了我,还给我带了饺子回家,这让我感觉很幸福。谢谢,谢谢,谢谢。2.我太幸福了,我很感恩师父晚上的直播,因为听他的分享我知道怎么更好的去
为了在未来的人工智能世界中取得成功,学生们必须学习人类写作的优点
睿邸管家
澳大利亚各地的学生在新学年开始使用铅笔、钢笔和键盘学习写字。在工作场所,机器也在学习写作,如此有效,几年之内,它们可能会写得比人类更好。有时它们已经做到了,就像Grammarly这样的应用程序所展示的那样。当然,人类现在的日常写作可能很快就会由具有人工智能(AI)的机器来完成。手机和电子邮件软件常用的预测文本是无数人每天都在使用的一种人工智能写作形式。据AI行业研究机构称,到2022年,人工智能及
闭组进行时...
李亚青_强化班
今天是2019年12月1号距离开始三月学习的日子:2019年10月07,已经过去将近两个月,回顾这一阶段的学习,收获了什么?又学会了什么呢?图片发自App我想,收获最大的就是身边这一群人吧,有和蔼可亲的学姐,贴心的学长,嬉戏打闹,玩的不亦乐乎,但也同样认真踏实学习小伙伴图片发自App本以为在这样的时刻,有太多太多话,太多太多想法想要表达,可言到此处,又觉得似乎没有什么想要说的了还是那句话,幸运遇到
2021-10-23
赵甄文的幸福
秀荣感恩日记Day42[烟花]感恩语录感恩自己有能力有好身体,可以到处走动,做自己想做的事情10.23感恩日记今天做的事情瑜伽一小时户外散步一小时泡脚20分钟学习打卡和孩子沟通[爱心]感动的瞬间今天瑜伽回来,发现老公在厨房里做鱼。每次老公有时间休息的时候都会给我做硬菜。刘姐约我一起去公园散步晒太阳。虽然完美错过,但心里还是暖暖的。每天睁开眼打开手机,先去自己的群里逛一逛,每每发现有人点赞或者互动都
孤独的守候
怒吼的生命
孤独了时光岁月了寂寞带来了惆怅那些孤独的日子里我们珍惜奋斗起来品味人生的真谛做到更好奋斗当中的你是那么努力格外自律学习起来五彩斑斓那些日子时光匆匆人生的机会很多需要把握痛苦的回忆记得住那些忧愁孤苦五一的日子寂寞当中的你时光荏苒独自带给我荒草学习起来努力奋斗可是我们做的还不够把握发展生活带给我们更多希望静静的述说你的故事你的精彩人生当中我们总是努力把握生活带给我们更多的学习生活当中我们奋斗可是做的还
第八课: 写作出版你最关心的出书流程和市场分析(无戒学堂复盘)
人在陌上
今天是周六,恰是圣诞节。推掉了两个需要凑腿的牌局,在一个手机,一个笔记本,一台电脑,一杯热茶的陪伴下,一个人静静地回听无戒学堂的最后一堂课。感谢这一个月,让自己的习惯开始改变,至少,可以静坐一个下午而不觉得乏味枯燥难受了,要为自己点个赞。我深知,这最后一堂课的内容,以我的资质和毅力,可能永远都用不上。但很明显,无戒学堂是用了心的,毕竟,有很多优秀学员,已经具备了写作能力,马上就要用到这堂课的内容。
AI模型训练中过拟合和欠拟合的区别是什么?
workflower
人工智能 算法 人工智能 数据分析
在AI模型训练中,过拟合和欠拟合是两种常见的模型性能问题,核心区别在于模型对数据的学习程度和泛化能力:欠拟合(Underfitting)-定义:模型未能充分学习到数据中的规律,对训练数据的拟合程度较差,在训练集和测试集上的表现都不好(如准确率低、损失值高)。-原因:-模型结构过于简单(如用线性模型解决非线性问题);-训练数据量不足或特征信息不充分;-训练时间太短,模型尚未学到有效模式。-表现:训练
解读Servlet原理篇二---GenericServlet与HttpServlet
周凡杨
java HttpServlet 源理 GenericService 源码
在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
MySQL性能优化
bijian1013
数据库 mysql
性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:
a.优化查询
b.优化数据库结构
ThreadPool定时重试
dai_lm
java ThreadPool thread timer timertask
项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。
由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。
为了解决不定间隔的重试,选择Timer和TimerTask来完成
package threadpool;
public class ThreadPoolTest {
Oracle 查看数据库的连接情况
周凡杨
sql oracle 连接
首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。
select * from dict where table_name like '%SESSION%';
就可以查出一些表,然后根据这些表就可以获得会话信息
select sid,serial#,status,username,schemaname,osuser,terminal,ma
类的继承
朱辉辉33
java
类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends
格式:public class 类名(子类)extends 类名(父类){ }
子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和
protected属性,但要使用private属性仍需通过调用。
子类的方法可以重写,但必须和父类的返回值类
android 悬浮窗特效
肆无忌惮_
android
最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:
一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。
后来想利用Dialog的dismiss动画来完成。
自定义一个Dialog后,在styl
hadoop伪分布式搭建
林鹤霄
hadoop
要修改4个文件 1: vim hadoop-env.sh 第九行 2: vim core-site.xml <configuration> &n
gdb调试命令
aigo
gdb
原文:http://blog.csdn.net/hanchaoman/article/details/5517362
一、GDB常用命令简介
r run 运行.程序还没有运行前使用 c cuntinue 
Socket编程的HelloWorld实例
alleni123
socket
public class Client
{
public static void main(String[] args)
{
Client c=new Client();
c.receiveMessage();
}
public void receiveMessage(){
Socket s=null;
BufferedRea
线程同步和异步
百合不是茶
线程同步 异步
多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法
多线程和异步:多线程可以做不同的事情,涉及到线程通知
&
JSP中文乱码分析
bijian1013
java jsp 中文乱码
在JSP的开发过程中,经常出现中文乱码的问题。
首先了解一下Java中文问题的由来:
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
js实现页面跳转重定向的几种方式
bijian1013
JavaScript 重定向
js实现页面跳转重定向有如下几种方式:
一.window.location.href
<script language="javascript"type="text/javascript">
window.location.href="http://www.baidu.c
【Struts2三】Struts2 Action转发类型
bit1129
struts2
在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configurat
【HBase十一】Java API操作HBase
bit1129
hbase
Admin类的主要方法注释:
1. 创建表
/**
* Creates a new table. Synchronous operation.
*
* @param desc table descriptor for table
* @throws IllegalArgumentException if the table name is res
nginx gzip
ronin47
nginx gzip
Nginx GZip 压缩
Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule
常用配置片段如下:
gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交
bylijinnan
java
public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the join
Spring源码学习-JdbcTemplate batchUpdate批量操作
bylijinnan
java spring
Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装
JDBC的batch操作:
String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展
comsci
工作流
生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........
竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
base64编码和url编码
cuityang
base64 url
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
web应用集群Session保持
dalan_123
session
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
dcj3sjt126com
数据库
public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCo
solr StatsComponent(聚合统计)
eksliang
solr聚合查询 solr stats
StatsComponent
转载请出自出处:http://eksliang.iteye.com/blog/2169134
http://eksliang.iteye.com/ 一、概述
Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能
二、参数
百度一道面试题
greemranqq
位运算 百度面试 寻找奇数算法 bitmap 算法
那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5} 找出出现次数为奇数的数字.
我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。
还有人觉得应该用算法xxx,我是没想到用啥算法好...!
还有觉得应该先排序...
还有觉
Spring之在开发中使用SpringJDBC
ihuning
spring
在实际开发中使用SpringJDBC有两种方式:
1. 在Dao中添加属性JdbcTemplate并用Spring注入;
JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节
justjavac
json
2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
网站项目建设流程概述
macroli
工作
一.概念
网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。
二.需求分析
项目立项
我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。
客户的需求说明书
第一步是需
AngularJs 三目运算 表达式判断
qiaolevip
每天进步一点点 学习永无止境 众观千象 AngularJS
事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。
var b = "{{",
a = "}}";
this.startSymbol = function(a) {
Spark算子:统计RDD分区中的元素及数量
superlxw1234
spark spark算子 Spark RDD分区元素
关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量
Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。
可以利用RDD的mapPartitionsWithInd
Spring 3.2.x将于2016年12月31日停止支持
wiselyman
Spring 3
Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。
请大家及时准备及时升级到Spring
fis纯前端解决方案fis-pure
zccst
JavaScript
作者:zccst
FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。
1,fis-pure的安装
$ fis install -g fis-pure
$ pure -v
0.1.4
2,下载demo到本地
git clone https://github.com/hefangshi/f