自学内容网 自学内容网

java 开发学习总结

一,注解
@Bean是一个注解,用于告诉 Spring 框架将标注的方法返回的对象注册为一个 Bean。
@Bean注解的方法名作为对象的名字。
@Bean 一般和 @Component或者@Configuration 一起使用。
@Component 注解的类中不能定义类内部依赖的@Bean注解的方法。@Configuration可以。
@Configuration
public class AppConfig {
@Bean
public Foo foo() {
return new Foo(bar());
}
@Bean
public Bar bar() {
return new Bar();
}
}
@Bean + @Configuration ,在调用@Bean注解的方法时返回的实例bean是从IOC容器获取的,已经注入的,且是单例的,而不是新创建的。
@Bean + @Component,虽然@Bean注解的方法返回的实例已经注入到SpringIOC容器中,但是每次调用@Bean注解的方法时,都会创建新的对象实例bean返回,并不会从IOC容器中获取。

二,
① 所有 官方发布 的 Starter 都遵循以下命名模式: spring-boot-starter-* :譬如 spring-boot-starter-jdbc
② 任何 第三方提供 的 Starter 都遵循以下命名模式: *-spring-boot-starter :譬如 mybatis-spring-boot-starter

三, Gradle
① Maven Helper 插件( Plugins)可以查看依赖关系
② MyBatisX 查看 mapper 与 xml 的映射
③ Gradle Version:<4.1 使用 compile,Gradle Version:>=4.1 拆分为 implementation 和 api ,compile和api会进行依赖传递,implementation不会进行传递依赖

四,java.lang
java.lang包是Java语言的核心类库(lang是language的缩写),包括了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。

五,schema

mysql中的schema:
数据库(database)包含模式(schema),模式包含表,索引等。
在mysql的实现中,数据库等价于模式,schema(模式)就是database(数据库)的代名词。比如:
使用show databases; 和show schemas 得到的结果是一致的。
create database; 和create schema;效果是一致的。


oracle中的schema:
创建一个用户的同时为这个用户创建一个与用户名同名的scheme,并把她作为该用户的缺省shcema。这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。
Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(Oracle中虽然有create schema语句,但是它并不是用来创建一个schema的),
schema的个数同user的个数相同,而且schema名字同user名字一一对应并且相同,所有我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。

六,@Autowired @Resource 的区别

① @Autowired @Resource 来源不同
package javax.annotation; @Resource
package org.springframework.beans.factory.annotation; @Autowired

② 查找实例不同
@Autowired 先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找;
@Resource 先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找。

③ 支持参数不同
@Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数

④ 对依赖注入的方式不同
@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入

⑤ 编译器的提示不同
当使用 IDEA 专业版在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息。 Could not autowire. No beans of 'SysTenantMapper' type found. 虽然 IDEA 会出现报错信息,但程序是可以正常执行的。 然后,我们再将依赖注入的注解更改为 @Resource 就不会出现报错信息了

七,java包介绍

@Configuration 与 @ConfigurationProperties 区别:
1,来自的包不同
Configuration 来自 org.springframework.context.annotation;
ConfigurationProperties 来自 org.springframework.boot.context.properties;
@Configuation等价于<Beans></Beans>
@Bean等价于<Bean></Bean>


java 包的介绍:
javax是Java编程语言提供的标准扩展库,提供了各种各样的接口和类,用于实现不同领域的功能。它是Java标准库(java.lang, java.util, java.io等)的扩展,使得开发者能够更方便地开发各种类型的应用程序。
javax包括了多个子包,每个子包都提供了特定领域的功能。常用的子包有:
javax.swing:提供了创建图形用户界面(GUI)的类和接口。
javax.servlet:用于开发Java Web应用程序的Servlet API。
javax.xml.bind:用于将Java对象与XML文档之间进行转换的API。

使用示例:
import java.lang.*; java包是Java API标准的包。
import javax.servlet.http.*; javax是扩展包。

八,无状态bean, 有状态bean 的线程案例

Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
ThreadLocal,连接ThreadLocalMap和Thread,来处理Thread的TheadLocalMap属性。

无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”。
有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。
默认情况下,从bean工厂所取得的实例为Singleton(无状态的), 若每次对bean的请求都会创建一个新的bean实例,刚用Prototype(有状态的)。

例:
RequestContextHolder 所持有的请求上下文信息是有状态的。这意味着每个请求线程会有其自己的上下文信息,并且这些信息只对当前线程可见。
RequestContextHolder 是一个线程安全的工具类,它通过使用 InheritableThreadLocal 来保证同一个请求在不同线程中的上下文信息是一致的。

扩展:
InheritableThreadLocal的思路是在创建的时候进行拷贝ThreadLocalMap。
TransmittableThreadLocal的思路则是在运行前(run()之前拷贝ThreadLocalMap)

九,Mybatis,Mybatis-plus,Mybatis-mate,Mybatis-felx

mybatis 相关:

多租户忽略表的注解:@InterceptorIgnore(tenantLine = "1")

https://baomidou.com/pages/223848/#fieldfill
https://mybatis-flex.com/zh/intro/maven.html

十,@ComponentScan 扫描

@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。与ComponentScan注解相对应的XML配置就是<context:component-scan/>, 根据指定的配置自动扫描package,将符合条件的组件加入到IOC容器中;

@ComponentScan有如下常用属性:

basePackages和value:指定要扫描的路径(package),如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径。
basePackageClasses:指定具体扫描的类。
includeFilters:指定满足Filter条件的类。
excludeFilters:指定排除Filter条件的类。
useDefaultFilters=true/false:指定是否需要使用Spring默认的扫描规则:被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;


1. 扫描指定类文件
@ComponentScan(basePackageClasses = Person.class)
2. 扫描指定包,使用默认扫描规则,即被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;
@ComponentScan(value = "com.example")
3. 扫描指定包,加载被@Component注解标记的组件和默认规则的扫描(因为useDefaultFilters默认为true)
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
4. 扫描指定包,只加载Person类型的组件
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false)
5. 扫描指定包,过滤掉被@Component标记的组件
@ComponentScan(value = "com.example", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
6. 扫描指定包,自定义过滤规则
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.CUSTOM, value = MtyTypeFilter.class) }, useDefaultFilters = true)

@ComponentScans({
@ComponentScan("com.st.demo1"),
@ComponentScan("com.st")
})

结果分析:
basePackages.*:这种情况路径后缀会变成*/**/*.class,组件只会扫描路径包中的子包里面的类,而当前包中的Bean不会被扫描到。
basePackages.**: 这种情况路径后缀会变成**/**/*.class,组件会扫描当前包以及子包中的Bean.
basePackages:这种情况路径后缀会变成/**/*.class,组件会扫描当前包以及子包中的Bean.

十一, EMQX 共享订阅与广播订阅

以EMQX为例,配置共享订阅包括开启该功能,设置均衡策略,并在订阅时使用$share/前缀。发布和订阅的主题需遵循特定规则,确保消息正确路由。
共享订阅(集群消费)
广播订阅(结点消费)-> EMQX 默认的
注意:共享订阅是在订阅时设置topic的名字,延迟发布是在发布时设置topic的名字

十二,Spring Boot 应用程序启动执行代码

CommandLineRunner --启动完成后执行, 可以获取启动的命令行参数但不解析命令行,发生异常应用程序不能正常启动。
ApplicationRunner --启动完成后执行, 可以获取启动的命令行参数并解析命令行,发生异常应用程序不能正常启动。
ApplicationListener --启动完成后执行, 不能获取命令行。
@PostConstruct --启动过程中执行, 执行耗时长影响应用程序的启动。
InitializingBean --启动过程中执行, InitializingBean比使用 @PostConstruct 更安全,当依赖尚未自动注入的 @Autowired 字段,则 @PostConstruct 方法可能会遇到 NullPointerExceptions

十三,nginx 上传文件大小的配置(配置好了,需要重启nginx)

如果需要设置 client_max_body_size, client_body_buffer_size 的值,你可以在 Nginx 配置文件中的 http、server 或 location 块中添加这个指令,并指定你想要的缓冲区大小。
文件小于client_body_buffer_size直接在内存中高效存储。如果大于client_body_buffer_size小于client_max_body_size会存储临时文件,临时文件一定要有权限。
如果追求效率,就设置 client_max_body_size client_body_buffer_size相同的值,这样就不会存储临时文件,直接存储在内存了。
client_max_body_size 1024M;
client_body_buffer_size 64M;


原文地址:https://blog.csdn.net/xichji/article/details/140627733

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!