首页
留言
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
页面
留言
搜索到
10
篇与
SpringBean
的结果
2023-02-26
Java Spring 获取Bean的三种方式
Java Spring 获取Bean的三种方式
2023年02月26日
123 阅读
0 评论
0 点赞
2023-02-26
Java Spring beans的profile属性切换环境
Java Spring beans的profile属性切换环境<beans>标签,除了经常用的作为根标签外,还可以嵌套在根标签内,使用profile属性切换开发环境可以使用以下两种方式指定被激活的环境(dev为环境名):使用命令行动态参数,虚拟机参数位置加载 -Dspring.profiles.active=dev使用代码的方式设置环境变量System.setProperty("spring.profiles.active","dev")beans.xml <bean class="org.example.UserDaoImpl" id="userDao"/> <bean class="org.example.UserServiceImpl" id="userService"/> <beans profile="dev"> <bean id="userService1" class="org.example.UserServiceImpl"/> </beans> <beans profile="test"> <bean id="userDao1" class="org.example.UserDaoImpl"/> </beans>主函数调用 public static void main(String[] args) { // 指定环境 System.setProperty("spring.profiles.active","dev"); ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); System.out.println(((UserService) applicationContext.getBean("userService"))); System.out.println(((UserDao) applicationContext.getBean("userDao"))); System.out.println(((UserService) applicationContext.getBean("userService1"))); System.out.println(((UserDao) applicationContext.getBean("userDao1"))); }执行结果org.example.UserServiceImpl@589b3632 org.example.UserDaoImpl@45f45fa1 org.example.UserServiceImpl@4c6e276e Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDao1' available
2023年02月26日
126 阅读
0 评论
0 点赞
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日
108 阅读
0 评论
0 点赞
1
2