8月19日

今天开始写搜索的API,面向用户的,。

从今天开始,每天增加两道leetcode题解,放在文章末尾。

注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行:

1
2
3
4
@Scheduled(fixedDelay = 5000)
public void doSomething() {
// something that should execute periodically
}

Map遍历的方式:

1
2
3
4
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(Map.Entry<Integer,Integer> entry:map.entrySet()){

}

Spring AOP 中@Pointcut的用法

1
@Pointcut("execution(public * com.xxxxxx.cnht.search.controller.*.*(..))")

(..)表示零个或多个任意参数,各个参数也可以用“*”来表示匹配任意类型的参数,全路径的类名等

  • 异常类型匹配(throws-pattern?)

在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)

1
2
3
4
//Pointcut表示式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){}

然后要使用所定义的Pointcut时,可以指定Pointcut签名
如下:

1
@Before("og()")

这种使用方式等同于以下方式,直接定义execution表达式使用

1
@Before("execution(* com.savage.aop.MessageSender.*(..))")

@Around的作用,SpringAOP增强处理

用来在调用一个具体方法前和调用后来完成一些具体的任务。

比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;

再比如我们想在执行方法时动态修改参数值等

类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验证等方面。

  • 既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
  • 可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
  • 可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值; 当需要改变目标方法的返回值时,只能使用Around方法;

虽然Around功能强大,但通常需要在线程安全的环境下使用。因此,如果使用普通的Before、AfterReturing增强方法就可以解决的事情,就没有必要使用Around增强处理了。

切面执行顺序:

异常:

概念
Joint Point
JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。

Pointcut
pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。
pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut当做jointpoint的集合。

java内部类(又名嵌套类)

访问特点:

内部类可以直接访问外部类的成员,包括私有成员。之所以课直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this

而外部类要访问内部类中的成员必须要建立内部类的对象

  1. 内部类的修饰符

public ,private static …….

当内部类的修饰符 为static时 ,此时,当外部类加载的时候,该内部类已经存在了。所以我们可以认为其是一个外部类。

此时,访问内部类时,不需要再new一个外部类的方式去访问,直接 Outer.Inner in = new Outer.Inner();

当内部类中的成员也是静态的,那么久直接 Outer.Inner.function() ,注意: 如果内部类中定义了静态成员,那么该内部类必须是静态的。

访问局部变量,该局部变量就要被定义为final类型,

事实上,当存在有内部类时,经过编译之后,会产生两个class文件,内部类和外部类各一个,那么调用内部类的方法时怎么访问外部类的局部变量呢?

实际上,编译后的内部类的构造方法中传入了对应的外部类的引用所有局部变量的形参

由于外部类方法执行完后局部变量会消亡,所以内部类构造函数中的局部变量实际是一份“复制”

而为了访问外部类中的私有成员变量,外部类编译后也产生了访问类似与getXXX的方法。)

所以如果不修饰为final,可能会造成内部类构造完成之后外部类的局部变量的内容发生了改变,这是不被允许的。

匿名内部类的具体应用。

通常的使用场景之一:

当函数参数是接口类型时,并且接口中的方法不超过3个,可以用匿名内部类作为实际参数,进行传递。

@Builder注解

lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Builder方法,它提供在设计数据实体时,对外保持private setter,而对属性的赋值采用Builder的方式,这种方式最优雅,也更符合封装的原则,不对外公开属性的写操作!

@Builder声明实体,表示可以进行Builder方式初始化,@Value注解,表示只公开getter,对所有属性的setter都封闭,即private修饰,所以它不能和@Builder现起用

注解@Slf4j的使用

声明:如果不想每次都写private final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j;

@Slf4j是用作日志输出的,一般会在项目每个类的开头加入该注解,如果不写下面这段代码,并且想用log

输出Info日志

这个日志打印到哪里了呢

在配置文件,如properties,yaml文件内写好输出日志的文件路径。那么log就会输出到对应的文件内,方便后期查看!

代码最后一行的log.info(),这就直接输出到了控制台,如果想要把文件输出到某个文件中的话,你可以在写启动脚本的时候设置输出到什么位置

@JsonIgnore注解

作用:在json序列化时将pojo中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。

1
2
@JsonIgnore
private String password;// 密码

Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。

同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过context:component-scan/实现。如下所示:

@Repository注解修饰哪个类,则表明这个类具有对对象进行CRUD(增删改查)的功能,而且@Repository@Component注解的一个派生品,所以被@Repository注解的类可以自动的被@ComponentScan 通过路径扫描给找到。

@Query(“SELECT U FROM User U “)
User selectXuanze();

/**
 * select u.name ,u.statues from User u where u.name=?1 and u.pwd=?2
 * 不能用实体传参,只能用list传参
 * @param name
 * @param pwd
 * @return
 */
 @Query("select u.name ,u.statues from User u where u.name=?1 and u.pwd=?2 ")
 List<User> selectstatuc(String name, String pwd);
@Query("SELECT U.name,U.statues FROM User U WHERE U.name=?1 AND U.pwd=?2")
void  selectname(String name,String pwd);

}

@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。

Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。