5.1 依赖查找前世今生
public interface BeanContext extends BeanContextChild, Collection, DesignMode, Visibility {
// ...
}
java.beans.beancontext.BeanContext 针对 GUI 程序以及普通计算程序,Spring 的实现很大程度上参考了其实现,其实现了 Collection 接口,因此其内部所有成员都是 Bean,BeanContext 负责对其进行 crud 操作
5.2 单一类型依赖查找
Spring 中单一类型依赖查找依赖 BeanFactory 接口,可以根据名称、类型(实时和延迟查找)、名称+类型进行查找。
延迟查找举例如下:
public class ObjectProviderDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ObjectProviderDemo.class);
lookupByObjectProvider(context);
context.close();
}
@Bean
public String helloWorld() {
return "Hello World";
}
private static void lookupByObjectProvider(AnnotationConfigApplicationContext context) {
ObjectProvider beanProvider = context.getBeanProvider(String.class);
System.out.println(beanProvider.getObject());
}
}
5.3 集合类型依赖查找(ListableBeanFactory)
Spring 中集合类型依赖查找依赖 ListableBeanFactory 接口,查找方式如下:
根据 Bean 类型查找
根据注解查找
Spring 3.0 获取标注类型 Bean 名称列表(BeanDefinition 中进行查找,Bean 还未实例化 )
Spring 3.0 获取标注类型 Bean 实例列表(Bean 已经 实例化或者会触发 Bean 的实例化)
Spring 3.0 获取指定名称+标注类型 Bean 实例(Bean 已经 实例化或者会触发 Bean 的实例化)
5.4 层次性依赖查找
层次型依赖查找依赖 HierarchicalBeanFactory 接口
真正使用时通过使用 ConfigurableListableBeanFactory 来使用,接口间继承关系如下:
// 父子级联容器接口(类似双亲委派,优先在父容器中查找,找不到才在子容器中查找)
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* Return the parent bean factory, or {@code null} if there is none.
*/
@Nullable
BeanFactory getParentBeanFactory();
/**
* Return whether the local bean factory contains a bean of the given name,
* ignoring beans defined in ancestor contexts.
* This is an alternative to {@code containsBean}, ignoring a bean
* of the given name from an ancestor bean factory.
* @param name the name of the bean to query
* @return whether a bean with the given name is defined in the local factory
* @see BeanFactory#containsBean
*/
boolean containsLocalBean(String name);
}
// 可配置容器接口,包含父子级联功能以及单例注册功能,自己新增的功能有配置BeanFacory的属性,比如BeanPostProcessor、PropertyEditor等
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
// ...
}
// 可配置容器接口,包含集合容器功能、自动注入(非Spring管理的Bean实现依赖注入,被注入的对象必须是Spring容器内的对象)、可配置容器接口(父子级联、单例注册)
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
// ...
}
根据名称查找举例:
public class HierarchicalDependencyLookupDemo {
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(HierarchicalDependencyLookupDemo.class);
// 获取 HierarchicalBeanFactory <- ConfigurableBeanFactory <- ConfigurableListableBeanFactory
ConfigurableListableBeanFactory factory = context.getBeanFactory();
System.out.println("当前 BeanFactory 的 parent :" + factory.getParentBeanFactory());
// 添加 parentBeanFactory
HierarchicalBeanFactory parentBeanFactory = createParentBeanFactory();
factory.setParentBeanFactory(parentBeanFactory);
System.out.println("当前 BeanFactory 的 parent :" + factory.getParentBeanFactory());
displayContainsBean(factory, "user");
displayLocalBean(factory, "user");
displayLocalBean(parentBeanFactory, "user");
// 启动上下文
context.refresh();
// 关闭上下文
context.close();
}
// 创建父容器
private static HierarchicalBeanFactory createParentBeanFactory() {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions("classpath:beans-ioc-lookup.xml");
return factory;
}
private static void displayLocalBean(HierarchicalBeanFactory factory, String beanName) {
System.out.printf("当前 BeanFactory[%s] 是否包含 Local Bean[name: %s] : %s\n", factory, beanName, factory.containsLocalBean(beanName));
}
private static void displayContainsBean(HierarchicalBeanFactory factory, String beanName) {
System.out.printf("当前 BeanFactory[%s] 是否包含 Bean[name: %s] : %s\n", factory, beanName, containsBean(factory, beanName));
}
// 类似双亲委派,优先从父容器中查找,递归查找
private static boolean containsBean(HierarchicalBeanFactory factory, String beanName) {
BeanFactory parentBeanFactory = factory.getParentBeanFactory();
if (parentBeanFactory instanceof HierarchicalBeanFactory) {
HierarchicalBeanFactory hierarchicalBeanFactory = (HierarchicalBeanFactory) parentBeanFactory;
if (containsBean(hierarchicalBeanFactory, beanName)) {
return true;
}
}
return factory.containsLocalBean(beanName);
}
}
// 输出结果:
当前 BeanFactory 的 parent :null
当前 BeanFactory 的 parent :org.springframework.beans.factory.support.DefaultListableBeanFactory@282003e1: defining beans [user,superUser,userRepository,objectFactory]; root of factory hierarchy
当前 BeanFactory[org.springframework.beans.factory.support.DefaultListableBeanFactory@25359ed8: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,hierarchicalDependencyLookupDemo]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@282003e1] 是否包含 Bean[name: user] : true
当前 BeanFactory[org.springframework.beans.factory.support.DefaultListableBeanFactory@25359ed8: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,hierarchicalDependencyLookupDemo]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@282003e1] 是否包含 Local Bean[name: user] : false
当前 BeanFactory[org.springframework.beans.factory.support.DefaultListableBeanFactory@282003e1: defining beans [user,superUser,userRepository,objectFactory]; root of factory hierarchy] 是否包含 Local Bean[name: user] : true
5.5 延迟依赖查找
延迟查找依赖的接口:
思考:非延迟初始化的 bean 是否能够实现延迟查找?
public class ObjectProviderDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ObjectProviderDemo.class);
context.refresh();
lookupByObjectProvider(context);
lookupIfAvailable(context);
lookupByStreamOps(context);
context.close();
}
private static void lookupByStreamOps(AnnotationConfigApplicationContext context) {
ObjectProvider provider = context.getBeanProvider(String.class);
provider.stream().forEach(System.out::println);
}
private static void lookupIfAvailable(AnnotationConfigApplicationContext context) {
ObjectProvider beanProvider = context.getBeanProvider(User.class);
User user = beanProvider.getIfAvailable(User::user);
System.out.println("当前 User 对象:" + user);
}
@Bean
@Primary
public String helloWorld() {
return "Hello World";
}
@Bean
public String message() {
return "Message";
}
private static void lookupByObjectProvider(AnnotationConfigApplicationContext context) {
ObjectProvider beanProvider = context.getBeanProvider(String.class);
System.out.println(beanProvider.getObject());
}
}
5.6 安全依赖查找
依赖查找安全性对比:
依赖查找类型
代表实现
是否安全
单一类型查找
BeanFactory#getBean
否
ObjectFactory#getObject
否
ObjectProvider#getIfAvailable
是
集合类型查找
ListableBeanFactory#getBeansOfType
是
ObjectProvider#stream
是
安全与否在于调用方法进行依赖查找时是否会触发异常。
层次类型依赖查找安全性依赖于单一或者集合类型依赖查找安全性
推荐使用 ObjectProvider 进行依赖查找,因为可以实现单一和集合类型查找,并且查找是安全的
5.7 内建可查找依赖
AbstractApplicationContext 内建可查找的依赖
Bean名称
Bean 实例
使用场景
environment
Environment 对象
外部化配置以及 Profiles
SystemProperties
java.util.Properties 对象
Java 系统属性
systemEnvironment
java.util.Map 对象
操作系统环境变量
messageSource
MessageSource 对象
国际化文案
lifecycleProcessor
LifecycleProcessor 对象
Lifecycle Bean 处理器
applicationEventMulticaster
ApplicationEventMulticaster 对象
Spring 事件广播器
注解驱动 Spring 应用上下文内建可查找依赖(部分)(componentScan或者使用ApplicaitonContext激活这些内部 Bean)(名称很长也比较难记,可以在AnnotationConfigUtils类中进行查找)
Bean 名称
Bean 实例
使用场景
org.springframework.context.annotation.internalConfigurationClassPostProcessor(BeanFactory生命周期)
ConfigurationClassPostProcessor对象
处理 Spring 配置类
org.springframework.context.annotation.internalAutoWiredAnnotationBeanPostProcessor
AutoWiredAnnotationBeanPostProcessor 对象
处理 @Autowired 以及 @ Value 注解
org.springframework.context.annotation.internalCommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor 对象
(条件激活)处理 JSR-250 注解,如 @PostConstructor 等
org.springframework.context.annotation.internalEventListenerMethodProcessor
EventListenerMethodProcessor 对象
处理标注 @EventListener 的 Spring 事件监听方法
org.springframework.context.annotation.internalDefaultEventListenerFactory
DefaultEventListenerFactory
@EventListener 事件监听方法适配为 ApplicationListener
org.springframework.context.annotation.internalPersistenceAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
(条件激活)处理 JPA 注解场景
5.8 依赖查找经典异常
BeansException 子类型(非 check 异常,Runtime 异常)
异常类型
触发条件(举例)
场景举例
NoSuchBeanDefinitionException
当查找 Bean 不存在于 IoC 容器时
BeanFactory#getBean ObjectFactory#getObject
NoUniqueBeanDefinitionException
类型依赖查找时,IoC 容器存在多个 Bean 实例
BeanFactory#getBean
BeanInstantiationException
当 Bean 所对应的类型非具体类型时
BeanFactory#getBean
BeanCreationException
当 Bean 初始化过程出错
Bean 初始化方法执行异常时
BeanDefinitionStoreException
当 BeanDefinition 配置元信息非法时
XML 配置资源无法打开时
5.9 面试题
5.9.1 ObjectFactory 和 BeanFactory 区别
ObjectFactory 是 Spring 比较早期的接口,ObjectFactory 和 BeanFactory 均提供依赖查找功能,不同点:
从实用也可以看出:
public class ObjectFactoryCreatingFactoryBean extends AbstractFactoryBean> {
@Nullable
private String targetBeanName;
/**
* Set the name of the target bean.
* The target does not have to be a non-singleton bean, but realistically
* always will be (because if the target bean were a singleton, then said singleton
* bean could simply be injected straight into the dependent object, thus obviating
* the need for the extra level of indirection afforded by this factory approach).
*/
public void setTargetBeanName(String targetBeanName) {
this.targetBeanName = targetBeanName;
}
@Override
public void afterPropertiesSet() throws Exception {
Assert.hasText(this.targetBeanName, "Property 'targetBeanName' is required");
super.afterPropertiesSet();
}
@Override
public Class getObjectType() {
return ObjectFactory.class;
}
@Override
protected ObjectFactory createInstance() {
BeanFactory beanFactory = getBeanFactory();
Assert.state(beanFactory != null, "No BeanFactory available");
Assert.state(this.targetBeanName != null, "No target bean name specified");
return new TargetBeanObjectFactory(beanFactory, this.targetBeanName);
}
/**
* Independent inner class - for serialization purposes.
* 此处生成 ObjectFactory 对象,当通过 Spring 容器获取对象时,其实获取的是 ObjectFactory#getObject方法返回的对象
* 此处是从容器中获取对象的
*/
@SuppressWarnings("serial")
private static class TargetBeanObjectFactory implements ObjectFactory, Serializable {
private final BeanFactory beanFactory;
private final String targetBeanName;
public TargetBeanObjectFactory(BeanFactory beanFactory, String targetBeanName) {
this.beanFactory = beanFactory;
this.targetBeanName = targetBeanName;
}
@Override
public Object getObject() throws BeansException {
// 从 Spring 容器中根据 name 获取 bean 返回
return this.beanFactory.getBean(this.targetBeanName);
}
}
}
5.9.2 BeanFactory#getBean 方法是否线程安全
是线程安全的,操作过程中会通过 synchronized 加锁,jdk 5 update 6 中新增偏向锁功能,该功能可以大大降低 synchronized 关键字的重量,在只有一个线程访问时,可以将只看为没有锁(只有加锁时会执行一个 CAS 操作将锁偏向当前线程,后续该线程运行到加锁位置只会比较偏向锁线程是否为当前线程,是的话就通过 CAS 替换一次 lock record,后续不再加锁),因此不建议将启动过程放在子线程执行,就在 main 主线程执行性能是最好的
5.9.4 Spring 的依赖查找和依赖注入在来源上有什么区别
依赖查找只能查询容器中有的 Bean(手动注入或者框架内建),但是依赖注入除了容器中有的 Bean 以外,还支持注入非 Bean 对象(内建依赖)
你可能感兴趣的:(Spring,spring,java)
Spring Boot中的策略模式:如何基于ID灵活选择服务类?
墨瑾轩
一起学学Java【一】 spring boot 策略模式 后端
关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣SpringBoot中的策略模式:如何基于ID灵活选择服务类?在软件开发中,策略模式是一种行为设计模式,它使你能够在运行时更改算法或行为。在SpringBoot应用中,通过策略模式实现基于某种条件(如ID)来动态选择不同的服务类,可以使代码更加灵活和可维护。本
jedis,lettuce,redisson对比
虎哥和你一起学编程
redis
jedis是一个老牌的java的redis客户端,仅支持同步的方式连接,redis官网有一句这样的话JedisisasynchronousJavaclientforRedis.UseLettuceifyouneedamoreadvancedJavaclientthatalsosupportsasynchronousandreactiveconnections。官方也推荐如果需要异步或者响应式的支持
SpringBoot篇之集成Jedis、Lettuce、Redisson
AK@
springboot spring boot 后端 java
目录前言一、详解Jedis、Lettuce和Redisson的区别二、SpringBoot集成2.1集成Jedis2.2集成Lettuce2.3集成Redisson总结前言大家好,我是AK,最近在做新项目,基于旧项目框架修改,正好最近也在整理springboot相关知识,项目中用到Redis,因此整理出来,帮助需要的小伙伴搞清楚到底选择哪个Redis客户端库。一、详解Jedis、Lettuce和R
java poi居中_使用apache poi在合并单元格中水平居中图像
爱军习武
java poi居中
将图片放置在Excel表格中是一件棘手的事情,因为图片被锚定在两个单元格上。左上角的锚点单元加上delta-x和delta-y来确定图片左上角的位置。右下角锚点单元格加上delta-x和delta-y来确定大小。单元格是否合并对此过程并不重要。因此,为了水平居中,我们需要计算哪一个是左上角的锚点单元加上delta-x。幸运的是,右下角锚点单元格加上delta-x和delta-y,可以通过在设置左上
Jedis那么低性能,还在用?赶紧换上 lettuce 吧
白露与泡影
java redis 数据库
最近有很多小伙伴在面大厂,经常遇到下面的问题:3大redis客户端:Jedis、Redisson、Lettuce,如何选型?今天就来深入聊聊这个问题Redis的3大Java客户端组件Redis官方推荐的Java客户端有Jedis、lettuce和Redisson。客户端组件1:JedisJedis是老牌的Redis的Java实现客户端,提供了比较全面的Redis命令的支持、Jedis在线网址:ht
带你深入了解前端【HTML+JavaScript】
软件技术NINI
前端 html javascript
DeepSeek-R1满血版思考完成嗯,用户想要深入了解前端中的HTML和JavaScript,所以我需要整理相关的信息,参考提供的搜索结果,特别是和,因为它们直接提到了HTML和JavaScript的结合使用。首先,确定HTML和JavaScript的基本关系,然后看看各个搜索结果里的内容有什么可以整合的。比如,搜索结果详细介绍了src和href的区别,而则讲解了如何在HTML中使用sc
解锁 ES6 访问器属性 Getter & Setter
代码里的小猫咪
前端 访问器属性 Getter Setter
在JavaScriptES6及其后续版本中,可以使用访问器属性(AccessorProperties)来定义getter和setter,从而拦截对象属性的访问和赋值。这种机制不仅提供了更灵活的属性管理方式,还能增强数据的封装性和安全性。1.访问器属性(Getters和Setters)在ES6的class语法中,可以使用get和set关键字定义访问器属性,这样可以像访问普通属性一样调用方法,而不需要
Java 项目问题:在 Maven 中导入了依赖,却在项目中无法引入依赖中的类
我命由我12345
后端 - 问题清单 java maven 开发语言 java-ee 后端 intellij-idea intellij idea
问题与处理策略问题描述com.diogonunesJColor5.5.1Java项目中,在Maven中导入了上述依赖,却在项目中无法引入依赖中的类问题原因可能是第一次下载依赖时,网络问题或Maven仓库问题导致依赖未完整下载可能是IDEA的缓存或相关问题,导致依赖无法使用处理策略尝试此策略:注释依赖->Maven同步->放开注释->Maven同步当注释掉依赖并同步时,Maven会从项目中移除该依赖
深入剖析 Netty:高性能网络编程框架的奥秘
艾斯比的日常
网络
引言在当今高并发的网络应用场景下,对网络编程的性能要求越来越高。Netty作为一个基于JavaNIO构建的高性能网络编程框架,凭借其卓越的性能表现,在众多网络应用中得到了广泛的应用。本文将深入剖析Netty性能高的原因,帮助开发者更好地理解和使用Netty。一、异步非阻塞I/O模型1.1传统阻塞I/O的困境在传统的阻塞I/O模型中,当一个线程进行I/O操作时,它会被阻塞,直到操作完成。这意味着在高
Vue3新特性指南:探索新增指令、内置组件和改进
山川湖海
Vue vue.js
Vue.js是一款流行的JavaScript框架,用于构建现代Web应用。Vue3是Vue.js的最新版本,引入了许多新特性和改进。本文将介绍Vue3新增的指令、内置组件以及其他值得关注的改进,并提供使用组合式API的用法示例。一、新增指令v-is指令:v-is指令用于动态组件,可以根据表达式的值来渲染不同的组件。用法:示例代码:import{ref}from'vue';importCompone
java中JUC工具类
小野喵喵。
java 开发语言
以下内容有AI回答生成内容,以及自己理解添加的内容,只用作了解记录。java的JUC(java.util.concurrent)包是java并发编程的核心工具包,提供了丰富的多线程和并发编程工具类。以下是其主要组件及典型示例:1.锁机制ReentrantLock:可重入互斥锁,替代synchronized,支持公平锁和非公平锁ReentrantReadWriteLock:读写分离锁,允许多个读线程
MySQL的 int , bigint字段与java的 int , long 字段反射/映射时,产生的问题
劲雨波
MySQL Java maven java mysql 开发语言
针对java连接mysql数据库映射时产生的问题java.lang.IllegalArgumentException:argumenttypemismatchatsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)总结了一下是字段类型不匹配的问题,整理了一下表格intMySQL无符号(unsigned)Javaint原本(未选择无符号
JDBC数据库连接
祈祷平安,加油
Java中级 数据库
一、了解JDBC概念JDBC(JavaDatabaseConnectivity)是一种用于执行SQL语句的JavaAPI,是Java和数据库之间的桥梁。它提供了一种标准化的方式来连接不同的数据库驱动程序,并通过Java程序执行SQL操作。组成部分JDBC由一组用Java语言编写的类和接口组成,主要包括以下几个部分:驱动管理:负责加载和注册数据库驱动。Connection接口:用于代表数据库的连接,
Java中看似简单的for循环,竟有这么多坑?
java小皮皮
Java 后端 Java编程 java jvm servlet
实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧?很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式都是人畜无害的吗?很多看似正常的操作其实背后是个陷阱,很多新手可能稍不留神就会掉入其中。倘若不幸踩中:代码运行时直接抛异常报错,这个算是不幸中的万幸,至少可以及时发现并去解决代码运行不报错,但是业务逻辑莫名其妙的出现各种奇怪问题,这种就比较悲剧了,因为
JDBC中日期时间的处理技巧
CptainLee
Java JDBC Java JAVA MYSQL JDBC
Java中用类java.util.Date对日期/时间做了封装,此类提供了对年、月、日、时、分、秒、毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等。java.util.Date中采用一个long型的数来保存日期/时间,它表示从格林威治时间1970年1月1日00点00分00秒至今的毫秒数。JDBC中,在这个类的基础之上扩展了3个类:java.sql.Date,jav
org.springframework.transaction.CannotCreateTransactionException: Could not open
CptainLee
Spring SSH
1.看看用户名/密码是否正确2.数据库是否启动3.看看spring的数据库、事务等配置文件我遇到这个问题是因为拷贝学习项目的时候,忘记改mysql密码了。。。。。
JAVA中简单的for循环竟有这么多坑,但愿你没踩过
ikyrxbxfas
Spring Java编程 Java java jvm servlet
实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧?很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式都是人畜无害的吗?很多看似正常的操作其实背后是个陷阱,很多新手可能稍不留神就会掉入其中。倘若不幸踩中:代码运行时直接抛异常报错,这个算是不幸中的万幸,至少可以及时发现并去解决代码运行不报错,但是业务逻辑莫名其妙的出现各种奇怪问题,这种就比较悲剧了,因为
JAVA程序员架构师教程资料MCA高级开发教程-从初级到高级(免费下载分享)
2501_90850230
人工智能 编程 素材资源 java 开发语言 架构师 MCA
架构师是负责系统整体架构设计的核心角色,其核心职责在于将业务需求转化为技术实现方案,确保系统的可扩展性、可维护性及高性能等非功能性需求15。他们需具备跨领域协调能力,既要深入技术细节(如技术选型、模块设计、代码规范),又要统筹全局,解决跨团队协作与边界划分问题教程下载JAVA程序架构师教程资料MCA高级开发教程下载https://pan.baidu.com/s/1ZWC_49O-S_V3UGc
前端开发手册大全
而 已
web javascript css html jquery css3
web前端开发手册大全(学习参考)html中文中文参考手册:https://www.html.cn/shouce/html/1.htmlJavaScript中文参考手册:https://www.html.cn/shouce/js/11.htmlCSS3.0参考手册:https://www.html.cn/doc/css3/CSS教程手册(新):https://www.html.cn/book/cs
maven的基本思想与基本操作
无足鸟丶
maven java
Maven是一个强大的项目管理和构建自动化工具,广泛应用于Java项目开发中。以下是Maven的一些常用知识:基本概念项目对象模型(POM):Maven项目的核心是pom.xml文件,它是一个XML文件,描述了项目的基本信息(如项目名称、版本、开发者等)、依赖关系、构建配置等。通过pom.xml,Maven可以了解项目的结构和需求,从而进行相应的构建和管理操作。约定优于配置:Maven遵循约定优于
线程wait后的等待队列
DanceDonkey
java 开发语言
常规情况在Java里,无论是使用Object类的wait()、notify()、notifyAll()方法,还是使用ReentrantLock搭配Condition的await()、signal()、signalAll()方法,基本遵循“哪个对象调用wait/await,线程就进入该对象对应的等待队列,且需由该对象来唤醒”的规则。使用Object的wait()、notify()、notifyAll
Maven 私服的搭建与使用(二)
计算机毕设定制辅导-无忧学长
# Maven maven java
四、使用Maven私服4.1将本地Maven仓库迁移到私服为了更高效地利用私服,我们可以将本地已有的Maven仓库迁移到私服中。这里我们使用迁移工具migrate-local-repo-tool.jar,你可以从相关官方渠道或可靠的资源平台获取该工具。在命令行中执行以下命令进行依赖迁移:java-jarmigrate-local-repo-tool.jar-cd"C:/Users/youruser
Maven 私服的搭建与使用(一)
计算机毕设定制辅导-无忧学长
# Maven maven java
一、引言在Java项目开发中,Maven作为强大的项目管理和构建工具,极大地提高了开发效率,而Maven私服在开发过程中也扮演着至关重要的角色。私服是一种特殊的远程仓库,架设在局域网内,代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件时,它首先从私服请求,如果私服上不存在该构件,才从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。搭建Mave
大疆无人机上云API:Java代码实战全攻略
小韩学长yyds
无人机 无人机 java 开发语言
✨✨✨这里是小韩学长yyds的BLOG✨✨✨想要了解更多内容可以访问我的主页小韩学长yyds目录开发前的准备上云API基础认知Java开发环境配置获取API凭证与身份验证核心代码实战-功能实现(一)无人机基本信息获取(二)飞行控制功能实现(三)相机控制与数据获取(四)实时数据监控与处理案例实践-具体应用场景开发常见问题与解决方法开发前的准备在使用上云API对大疆无人机进行Java代码二次开发之前,
Flink CDC + Oracle Demo
缘上寒山
flink oracle
本文用于说明Flink集成oraclecdc的方式pom.xml1.13.32.12org.apache.flinkflink-java${flink.version}provided-->org.apache.flinkflink-clients_2.11${flink.version}com.ververicaflink-connector-oracle-cdcprovided-->
Spring基础(五):Bean的生命周期
Lansonli
Spring系列核心知识 spring java Bean的生命周期
文章目录Bean的生命周期一、Bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法二、测试生命周期1、准备bean2、配置bean3、测试bean三、关于后置处理器1、创建后置处理器实现BeanPostProcesser重写两个方法2、配置后置处理器,对容器中的所有bean添加后置处理器的生命周期四、BeanPostProcessor接口作用Bean的生命周期一、Bean从创建到销毁经历的各
测试类中无法注入(找不到此bean)
一个想打代码的yebadi_
错误点 单元测试 spring boot
今天打开了一个项目进行方法测试的时候出现了一个错误。java.lang.NullPointerExceptionattest.example.Test1.test2(Test1.java:29)atjava.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atjava.base/jdk.internal
Java利用 Function 接口告别冗余代码,打造高效断言神器
奔向理想的星辰大海
Java研发实用技巧 云原生 技术研发 java python 数据库
在一个复杂的业务系统中,我们可能需要频繁地验证数据库中某个字段值是否有效,是否符合预期值。传统的做法可能充斥着大量相似的查询逻辑,每次都需要手动构建查询条件、执行查询并处理结果,这样的代码既冗长又难以维护。例如以下两个验证用户ID和部门ID是否有效的方法,虽然简单,但每次需要校验不同实体或不同条件时,就需要复制粘贴并做相应修改,导致代码库中充满了大量雷同的校验逻辑,给维护带来了困扰。//判断用户I
远程调用Dubbo和OpenFeign的详解
格子先生Lab
dubbo spring cloud
在微服务架构中,服务之间的远程调用(RPC)是核心功能之一。Dubbo和OpenFeign是两个常用的远程调用框架,分别适用于不同的场景。Dubbo是一个高性能的JavaRPC框架,而OpenFeign是SpringCloud生态中的声明式HTTP客户端,主要用于RESTful服务的调用。本文将详细介绍如何使用Dubbo和OpenFeign实现远程调用,并分析它们的适用场景。1.Dubbo简介Du
java 线程基础
java
Java线程基础创建线程在java编程中,我们可以继承Tread类并复写其run方法,然后new一个该对象,并调用其start方法,这样就可以开启一个新线程了。或者创建实现一个Runnable接口的类。然后将该对象传递给一个Thread队象。这样也可以开启一个线程。另外还一个使用线程池创建线程,或者使用带有返回值的Callable创建线程其实这些方式的本质都是一样的,本质上只有一种创建线程的方式。
JAVA中的Enum
周凡杨
java enum 枚举
Enum是计算机编程语言中的一种数据类型---枚举类型。 在实际问题中,有些变量的取值被限定在一个有限的范围内。 例如,一个星期内只有七天 我们通常这样实现上面的定义:
public String monday;
public String tuesday;
public String wensday;
public String thursday
赶集网mysql开发36条军规
Bill_chen
mysql 业务架构设计 mysql调优 mysql性能优化
(一)核心军规 (1)不在数据库做运算 cpu计算务必移至业务层; (2)控制单表数据量 int型不超过1000w,含char则不超过500w; 合理分表; 限制单库表数量在300以内; (3)控制列数量 字段少而精,字段数建议在20以内
Shell test命令
daizj
shell 字符串 test 数字 文件比较
Shell test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真
实例演示:
num1=100
num2=100if test $[num1]
XFire框架实现WebService(二)
周凡杨
java webservice
有了XFire框架实现WebService(一),就可以继续开发WebService的简单应用。
Webservice的服务端(WEB工程):
两个java bean类:
Course.java
package cn.com.bean;
public class Course {
private
重绘之画图板
朱辉辉33
画图板
上次博客讲的五子棋重绘比较简单,因为只要在重写系统重绘方法paint()时加入棋盘和棋子的绘制。这次我想说说画图板的重绘。
画图板重绘难在需要重绘的类型很多,比如说里面有矩形,园,直线之类的,所以我们要想办法将里面的图形加入一个队列中,这样在重绘时就
Java的IO流
西蜀石兰
java
刚学Java的IO流时,被各种inputStream流弄的很迷糊,看老罗视频时说想象成插在文件上的一根管道,当初听时觉得自己很明白,可到自己用时,有不知道怎么代码了。。。
每当遇到这种问题时,我习惯性的从头开始理逻辑,会问自己一些很简单的问题,把这些简单的问题想明白了,再看代码时才不会迷糊。
IO流作用是什么?
答:实现对文件的读写,这里的文件是广义的;
Java如何实现程序到文件
No matching PlatformTransactionManager bean found for qualifier 'add' - neither
林鹤霄
java.lang.IllegalStateException: No matching PlatformTransactionManager bean found for qualifier 'add' - neither qualifier match nor bean name match!
网上找了好多的资料没能解决,后来发现:项目中使用的是xml配置的方式配置事务,但是
Row size too large (> 8126). Changing some columns to TEXT or BLOB
aigo
column
原文:http://stackoverflow.com/questions/15585602/change-limit-for-mysql-row-size-too-large
异常信息:
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAM
JS 格式化时间
alxw4616
JavaScript
/**
* 格式化时间 2013/6/13 by 半仙 alxw4616@msn.com
* 需要 pad 函数
* 接收可用的时间值.
* 返回替换时间占位符后的字符串
*
* 时间占位符:年 Y 月 M 日 D 小时 h 分 m 秒 s 重复次数表示占位数
* 如 YYYY 4占4位 YY 占2位<p></p>
* MM DD hh mm
队列中数据的移除问题
百合不是茶
队列移除
队列的移除一般都是使用的remov();都可以移除的,但是在昨天做线程移除的时候出现了点问题,没有将遍历出来的全部移除, 代码如下;
//
package com.Thread0715.com;
import java.util.ArrayList;
public class Threa
Runnable接口使用实例
bijian1013
java thread Runnable java多线程
Runnable接口
a. 该接口只有一个方法:public void run();
b. 实现该接口的类必须覆盖该run方法
c. 实现了Runnable接口的类并不具有任何天
oracle里的extend详解
bijian1013
oracle 数据库 extend
扩展已知的数组空间,例:
DECLARE
TYPE CourseList IS TABLE OF VARCHAR2(10);
courses CourseList;
BEGIN
-- 初始化数组元素,大小为3
courses := CourseList('Biol 4412 ', 'Psyc 3112 ', 'Anth 3001 ');
--
【httpclient】httpclient发送表单POST请求
bit1129
httpclient
浏览器Form Post请求
浏览器可以通过提交表单的方式向服务器发起POST请求,这种形式的POST请求不同于一般的POST请求
1. 一般的POST请求,将请求数据放置于请求体中,服务器端以二进制流的方式读取数据,HttpServletRequest.getInputStream()。这种方式的请求可以处理任意数据形式的POST请求,比如请求数据是字符串或者是二进制数据
2. Form
【Hive十三】Hive读写Avro格式的数据
bit1129
hive
1. 原始数据
hive> select * from word;
OK
1 MSN
10 QQ
100 Gtalk
1000 Skype
2. 创建avro格式的数据表
hive> CREATE TABLE avro_table(age INT, name STRING)STORE
nginx+lua+redis自动识别封解禁频繁访问IP
ronin47
在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段 内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在 指定的封禁时间后实行自动解封的目的。
一、安装环境:
CentOS x64 release 6.4(Fin
java-二叉树的遍历-先序、中序、后序(递归和非递归)、层次遍历
bylijinnan
java
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
public class BinTreeTraverse {
//private int[] array={ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
private int[] array={ 10,6,
Spring源码学习-XML 配置方式的IoC容器启动过程分析
bylijinnan
java spring IOC
以FileSystemXmlApplicationContext为例,把Spring IoC容器的初始化流程走一遍:
ApplicationContext context = new FileSystemXmlApplicationContext
("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml&q
[科研与项目]民营企业请慎重参与军事科技工程
comsci
企业
军事科研工程和项目 并非要用最先进,最时髦的技术,而是要做到“万无一失”
而民营科技企业在搞科技创新工程的时候,往往考虑的是技术的先进性,而对先进技术带来的风险考虑得不够,在今天提倡军民融合发展的大环境下,这种“万无一失”和“时髦性”的矛盾会日益凸显。。。。。。所以请大家在参与任何重大的军事和政府项目之前,对
spring 定时器-两种方式
cuityang
spring quartz 定时器
方式一:
间隔一定时间 运行
<bean id="updateSessionIdTask" class="com.yang.iprms.common.UpdateSessionTask" autowire="byName" />
<bean id="updateSessionIdSchedule
简述一下关于BroadView站点的相关设计
damoqiongqiu
view
终于弄上线了,累趴,戳这里http://www.broadview.com.cn
简述一下相关的技术点
前端:jQuery+BootStrap3.2+HandleBars,全站Ajax(貌似对SEO的影响很大啊!怎么破?),用Grunt对全部JS做了压缩处理,对部分JS和CSS做了合并(模块间存在很多依赖,全部合并比较繁琐,待完善)。
后端:U
运维 PHP问题汇总
dcj3sjt126com
windows2003
1、Dede(织梦)发表文章时,内容自动添加关键字显示空白页
解决方法:
后台>系统>系统基本参数>核心设置>关键字替换(是/否),这里选择“是”。
后台>系统>系统基本参数>其他选项>自动提取关键字,这里选择“是”。
2、解决PHP168超级管理员上传图片提示你的空间不足
网站是用PHP168做的,反映使用管理员在后台无法
mac 下 安装php扩展 - mcrypt
dcj3sjt126com
PHP
MCrypt是一个功能强大的加密算法扩展库,它包括有22种算法,phpMyAdmin依赖这个PHP扩展,具体如下:
下载并解压libmcrypt-2.5.8.tar.gz。
在终端执行如下命令: tar zxvf libmcrypt-2.5.8.tar.gz cd libmcrypt-2.5.8/ ./configure --disable-posix-threads --
MongoDB更新文档 [四]
eksliang
mongodb Mongodb更新文档
MongoDB更新文档
转载请出自出处:http://eksliang.iteye.com/blog/2174104
MongoDB对文档的CURD,前面的博客简单介绍了,但是对文档更新篇幅比较大,所以这里单独拿出来。
语法结构如下:
db.collection.update( criteria, objNew, upsert, multi)
参数含义 参数
Linux下的解压,移除,复制,查看tomcat命令
y806839048
tomcat
重复myeclipse生成webservice有问题删除以前的,干净
1、先切换到:cd usr/local/tomcat5/logs
2、tail -f catalina.out
3、这样运行时就可以实时查看运行日志了
Ctrl+c 是退出tail命令。
有问题不明的先注掉
cp /opt/tomcat-6.0.44/webapps/g
Spring之使用事务缘由(3-XML实现)
ihuning
spring
用事务通知声明式地管理事务
事务管理是一种横切关注点。为了在 Spring 2.x 中启用声明式事务管理,可以通过 tx Schema 中定义的 <tx:advice> 元素声明事务通知,为此必须事先将这个 Schema 定义添加到 <beans> 根元素中去。声明了事务通知后,就需要将它与切入点关联起来。由于事务通知是在 <aop:
GCD使用经验与技巧浅谈
啸笑天
GC
前言
GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。
dispatch_once_t必须是全局或static变量
这一条算是“老生常谈”了,但我认为还是有必要强调一次,毕竟非全局或非static的dispatch_once_t变量在使用时会导致非常不好排查的bug,正确的如下: 1
linux(Ubuntu)下常用命令备忘录1
macroli
linux 工作 ubuntu
在使用下面的命令是可以通过--help来获取更多的信息1,查询当前目录文件列表:ls
ls命令默认状态下将按首字母升序列出你当前文件夹下面的所有内容,但这样直接运行所得到的信息也是比较少的,通常它可以结合以下这些参数运行以查询更多的信息:
ls / 显示/.下的所有文件和目录
ls -l 给出文件或者文件夹的详细信息
ls -a 显示所有文件,包括隐藏文
nodejs同步操作mysql
qiaolevip
学习永无止境 每天进步一点点 mysql nodejs
// db-util.js
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host: 'localhost',
user: 'root',
password: '',
database: 'test',
port: 3306
});
一起学Hive系列文章
superlxw1234
hive Hive入门
[一起学Hive]系列文章 目录贴,入门Hive,持续更新中。
[一起学Hive]之一—Hive概述,Hive是什么
[一起学Hive]之二—Hive函数大全-完整版
[一起学Hive]之三—Hive中的数据库(Database)和表(Table)
[一起学Hive]之四-Hive的安装配置
[一起学Hive]之五-Hive的视图和分区
[一起学Hive
Spring开发利器:Spring Tool Suite 3.7.0 发布
wiselyman
spring
Spring Tool Suite(简称STS)是基于Eclipse,专门针对Spring开发者提供大量的便捷功能的优秀开发工具。
在3.7.0版本主要做了如下的更新:
将eclipse版本更新至Eclipse Mars 4.5 GA
Spring Boot(JavaEE开发的颠覆者集大成者,推荐大家学习)的配置语言YAML编辑器的支持(包含自动提示,