首页
留言
Search
1
在Centos7下搭建Socks5代理服务器
1,036 阅读
2
在windows11通过Zip安装Mysql5.7
574 阅读
3
Mysql5.7开放远程登录
482 阅读
4
数据库
469 阅读
5
mysql5.7基本命令
377 阅读
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
登录
Search
标签搜索
java
centos7
linux
centos
html5
JavaScript
php
css3
mysql
spring
mysql5.7
linux全栈
ubuntu
BeanFactory
SpringBean
python
python3
ApplicationContext
kali
mysql8.0
我亏一点
累计撰写
139
篇文章
累计收到
8
条评论
首页
栏目
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
页面
留言
搜索到
34
篇与
java
的结果
2023-02-26
Java Spring 命名空间
Java Spring 命名空间Spring的默认标签用到的是Spring的默认命名空间beans.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> </beans>该命名空间约束下的默认标签如下:创建命名空间创建名为context的命名空间beans.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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd " > <context:property-placeholder/> </beans>import引入其他配置文件<import>标签,用于导入其他配置文件,项目变大后,就会导致一个配置文件内容过多,可以将一个配置文件根据业务某块进行拆分,拆分后,最终通过<import>标签导入到一个主配置文件中,项目加载主配置文件就连同<import>导入的文件一并加载了<import resource="classpath:beans.xml"></import>alias指定Bean别名断点调试中,BeanFactory下aliasMap中保存了alias指定的别名,并不会影响bean中name标签指定的值,但是也能通过alias指定的别名进行获取bean<bean class="org.example.UserDaoImpl" id="userDao"/> <bean class="org.example.UserServiceImpl" id="userService"/> <alias name="userDao" alias="dao"></alias> <alias name="userService" alias="service"></alias>
2023年02月26日
113 阅读
0 评论
0 点赞
2023-02-25
Java Spring 自动装配
Java Spring 自动装配如果被注入的属性类型是Bean引用的话,那么可以在<bean>标签中使用autowire属性去配置自动注入方式,属性值有两个byName:通过属性名自动装配,即去匹配setXxx与id="xxx"(name="xxx")是否一致;byType:通过Bean的类型从容器中匹配,匹配出多个相同Bean类型,报错。beans.xml<bean class="org.example.UserDaoImpl" id="userDao"/> <bean class="org.example.UserServiceImpl" id="userService" autowire="byName"/> <bean class="org.example.UserServiceImpl" id="userService1" autowire="byType"/>UserServicepublic interface UserService { public void show(); }UserServiceImplpublic class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao = userDao; } @Override public void show() { System.out.println(userDao); } }主函数调用public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); ((UserService) applicationContext.getBean("userService")).show(); ((UserService) applicationContext.getBean("userService1")).show(); }执行结果org.example.UserDaoImpl@1f0f1111 org.example.UserDaoImpl@1f0f1111如果xml文件自动装配中有多个同类型的bean容器将会报错例如:<bean class="org.example.UserDaoImpl" id="userDao"/> <bean class="org.example.UserDaoImpl" id="userDao1"/> <bean class="org.example.UserServiceImpl" id="userService" autowire="byName"/> <bean class="org.example.UserServiceImpl" id="userService1" autowire="byType"/>IDEA报错提示无法自动装配。存在多个 'UserDao' 类型的 Bean。Bean: userDao1,userDao。属性: 'userDao'运行结果提示警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService1' defined in class path resource [beans.xml]: Unsatisfied dependency expressed through bean property 'userDao'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.example.UserDao' available: expected single matching bean but found 2: userDao,userDao1 Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService1' defined in class path resource [beans.xml]: Unsatisfied dependency expressed through bean property 'userDao'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.example.UserDao' available: expected single matching bean but found 2: userDao,userDao1
2023年02月25日
131 阅读
0 评论
0 点赞
2023-02-22
Java 基于xml的Spring应用
Java 基于xml的Spring应用1.SpringBean 的配置解析Spring开发中主要是对Bean的配置,Bean的常用配置一览如下: 1.Bean的基础配置配置UserDaoImpl由Spring容器负责管理<bean id="userDao" class="org.example.UserDaoImpl"></bean>此时存储到Spring容器(singleObjects单例池)中的Bean的beanName是userDao,值是UserDaoImpl对象,可以根据beanName获取Bean实例applicationContext.getBean("userDao")如果不配置id,则Spring会把当前Bean实例的全限定名作为beanNamepublic static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserDao bean = (UserDao) applicationContext.getBean("org.example.UserDaoImpl"); System.out.println(bean); }如果配置了id,便不能在使用Bean实例的全限定名进行获取,例如:applicationContext.getBean("org.example.UserDaoImpl");配置别名,配置别名后可以使用别名获得Bean对象实例<bean id="userDao" name="aaa,bbb" class="org.example.UserDaoImpl"></bean>2.SpringBean的配置详解1.Bean的范围配置默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototypesingleton:单例,默认值,Spring容器创建的时候,就会进行Bean的实例化,并且存储到容器内部的单例池中,每次getBean时都是从单例池中获取相同的Bean实例<bean id="userDao" class="org.example.UserDaoImpl" scope="singleton"></bean>prototype:原型,Spring容器初始化时不会创建Bean实例,只有调用getBean时才会实例化Bean,每次getBean都会创建一个新的Bean实例<bean id="userDao" class="org.example.UserDaoImpl" scope="prototype"></bean>如果是spring-webmvc的情况下,还会增加两个作用范围:request和sessionmaven导包<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.7</version> </dependency>request:将创建的对象放在request域当做<bean id="userDao" class="org.example.UserDaoImpl" scope="request"></bean>session:将创建的对象放在session域当做<bean id="userDao" class="org.example.UserDaoImpl" scope="session"></bean>2.Bean的延迟加载当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时在创建Bean实例并且存储到单例池中去,后续在使用该Bean直接冲单例池获取,本质上该Bean还是单例的,只对scope设置为singleton的Bean起作用,对prototype无效,对BeanFactory作为容器也无效<bean id="userDao" class="org.example.UserDaoImpl" lazy-init="true"></bean>3.Bean的初始化方法和销毁方法init-method:初始化时运行方法destroy-method:销毁时运行方法,单例模式容器必须显示关闭才会执行这个方法,否则不会执行关闭,又因为ApplicationContext的接口没有关闭容器的方法,所以类型需要使用ClassPathXmlApplicationContext,才有close显式关闭容器,如果不使用显式关闭,则有可能不会执行销毁方法,例如容器挂掉后就无法执行销毁方法beans.xml:<bean id="userDao" class="org.example.UserDaoImpl" init-method="init" destroy-method="destroy"></bean>UserDaoImpl.javapublic class UserDaoImpl implements UserDao{ public void init(){ System.out.println("初始化方法"); } public void destroy(){ System.out.println("销毁方法"); } }主函数调用 public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); System.out.println(userDao); applicationContext.close(); }结果输出初始化方法 org.example.UserDaoImpl@7d68ef40 销毁方法扩展:除此之外,我们还可以通过实现InitializingBean接口,完成一些Bean的初始化操作,比init-method方法优先级要高UserDaoImpl.javapublic class UserDaoImpl implements UserDao, InitializingBean { public void init(){ System.out.println("初始化方法"); } public void destroy(){ System.out.println("销毁方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("属性执行之后进行调用"); } }主函数调用public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); System.out.println(userDao); applicationContext.close(); }结果输出属性执行之后进行调用 初始化方法 org.example.UserDaoImpl@5b0abc94 销毁方法4.Bean的实例化配置Spring的实例化方式主要如下两种:构造方式实例化:底层通过构造方法对Bean进行实例化工厂方式实例化:底层通过调用自定义的工厂方法对Bean进行实例化构造方式实例化Bean分为有参构造和无参构造方法实例化,Spring中配置的<bean>几乎都是无参构造,有参构造例子如下:UserDaoImpl.javapublic class UserDaoImpl implements UserDao { public UserDaoImpl(String name){ System.out.println(name); } }有参构造在实例化Bean时,需要参数的注入,通过constructor-arg标签,嵌入在bean标签内部提供构造参数beans.xml<bean id="userDao" class="org.example.UserDaoImpl"> <constructor-arg value="你好"/> </bean>工厂方式实例化Bean,又分为如下三种:静态工厂方法实例化Bean实例工厂方法实例化Bean实现FactoryBean规范延迟实例化Bean静态工厂实例化Bean:创建一个静态方法public class MyBeanFactory1 { public static UserDao userDao(){ return new UserDaoImpl(); } }配置beans.xml文件,factory-method指定静态方法,如果有传参也需要constructor-arg进行传值<bean id="userDao1" class="factory.MyBeanFactory1" factory-method="userDao"></bean>主函数调用public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Object useDao1 = applicationContext.getBean("userDao1"); System.out.println(useDao1); }执行结果org.example.UserDaoImpl@159f197实例工厂方法化Bean:创建一个方法public class MyBeanFactory2 { public UserDao userDao(){ return new UserDaoImpl(); } }beans.xml中配置该静态方法对bean,并且再次配置一个bean指向该bean,并且使用方法,如果有传参也需要constructor-arg进行传值<!-- 配置工厂对象 --> <bean id="myBeanFactory2" class="factory.MyBeanFactory2"></bean> <bean id="userDao2" factory-bean="myBeanFactory2" factory-method="userDao"></bean>主函数执行 public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Object userDao2 = applicationContext.getBean("userDao2"); System.out.println(userDao2); }结果输出org.example.UserDaoImpl@51e5fc98实现FactoryBean规范延迟实例化Bean类的接口继承于FactoryBean,在BeanFactory创建时便已经创建实例,但是实例的值并不是真实的对象本身,而是当getBean进行调用的时候,才会将实例对象新建调用getObject方法并且存放到缓存池,然后从缓存池取值从而返回实例对象,如果后续进行重复取值,不会再创建一个新的对象,而是从缓存池取值后直接返回,从而实现FactoryBean规范延迟加载Beanpublic class MyBeanFactory3 implements FactoryBean<UserDao> { @Override public UserDao getObject() throws Exception { return new UserDaoImpl(); } @Override public Class<?> getObjectType() { return null; } }主函数调用public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Object userDao3 = applicationContext.getBean("userDao3"); Object userDao4 = applicationContext.getBean("userDao3"); System.out.println(userDao3); System.out.println(userDao4); }运行结果org.example.UserDaoImpl@48fa0f47 org.example.UserDaoImpl@48fa0f475.Bean的注入方式 其中,ref是reference的缩写,翻译为参考涉及到意思,用于引入其他Bean的id。value用于注入普通的属性值。6.Bean的依赖注入配置配置注入普通类型的List对象配置接口public interface UserService { public List<String> getStringList(); }配置实现类public class UserServiceImpl implements UserService { //注入List private List<String> stringList; public void setStringList(List<String> stringList) { this.stringList = stringList; } public List<String> getStringList() { return stringList; } }配置Beans.xml文件<bean id="userService" class="org.example.UserServiceImpl"> <property name="stringList"> <list> <value>aaaa</value> <value>bbbb</value> <value>cccc</value> <value>dddd</value> </list> </property> </bean>主函数运行ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); System.out.println(userService.getStringList());运行结果[aaaa, bbbb, cccc, dddd]配置注入引用类型的List对象UserServicelmpl.javapublic List<String> getStringList() { return stringList; } public void setUserDaoList(List<UserDao> userDaoList) { this.userDaoList = userDaoList; }beans.xml需要配置ref或者单独创建bean<bean id="useService1" class="org.example.UserServiceImpl"> <property name="userDaoList"> <list> <bean class="org.example.UserDaoImpl"/> <bean class="org.example.UserDaoImpl"/> <bean class="org.example.UserDaoImpl"/> <bean class="org.example.UserDaoImpl"/> </list> </property> </bean>或者<bean id="userDao1" class="org.example.UserDaoImpl"/> <bean id="userDao2" class="org.example.UserDaoImpl"/> <bean id="userDao3" class="org.example.UserDaoImpl"/> <bean id="userDao4" class="org.example.UserDaoImpl"/> <bean id="useService1" class="org.example.UserServiceImpl"> <property name="userDaoList"> <list> <ref bean="userDao1"/> <ref bean="userDao2"/> <ref bean="userDao3"/> <ref bean="userDao4"/> </list> </property> </bean>配置注入引用类型的set对象配置和List一样,在beans.xml文件中,将list标签改为set配置注入引用类型的map对象配置和List一样,在beans.xml文件中,将list标签改为map,map中标签为entry,key为键名,value为键值,value-ref为引用对象<property name="map"> <map> <entry key="a" value="1111"/> <entry key="b" value="2222"/> </map> </property> <property name="map"> <map> <entry key="a" value-ref="userDao1"/> <entry key="b" value-ref="userDao2"/> </map> </property>
2023年02月22日
109 阅读
0 评论
0 点赞
2023-02-22
Java BeanFactory与ApplicationContext的关系与继承体系
BeanFactory与ApplicationContext的关系BeanFactory是Spring的早期接口,成为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring容器;ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向于底层,ApplicationContext的API大多数是对这些底层API的封装Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以ApplicationContext与BeanFactory既有继承关系,又有融合关系Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化初始化好BeanFactorypublic static void main(String[] args) { // 创建工厂对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 创建一个读取器(xml文件) XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); // 读取配置文件给工厂 reader.loadBeanDefinitions("beans.xml"); // 根据id获取bean实例对象,Bean在此时创建对象 UserService userService = (UserService) beanFactory.getBean("userService"); System.out.println(userService); }ApplicationContextpublic static void main(String[] args) { // 读取配置文件的时候便已经实例化初始化完成 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); System.out.println(userService); }BeanFactory与ApplicationContext的继承体系BeanFactor的继承体系BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListtableBeanFactory,而ApplicationContext内部维护的BeanFactory的实现类也是它ApplicationContext的继承体系只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系 只在Spring基础环境下,常用的三个ApplicationContext作用如下:
2023年02月22日
103 阅读
0 评论
0 点赞
2023-02-22
Java ApplicationContext
Java ApplicationContext快速入门ApplicationContext成为Spring容器,内部封装了BeanFactory,笔BeanFactory功能更丰富更强大,使用ApplicationContext进行开发式,xml配置文件的名称习惯写成applicationContent.xml1.使用ApplicationContext调用BeanFactory基础配置可看上一篇文章 点我跳转public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); System.out.println(userService); }运行结果:BeanFactory去调用该方法 从容器中获得userDao设置到此处org.example.UserDaoImpl@1e730495 org.example.UserServiceImpl@318ba8c8
2023年02月22日
117 阅读
0 评论
0 点赞
1
2
3
4
...
7