id和name
id只能取一个,name可以取多个,,,不同的bean,,id和name不能重复…
name之间可以使用,
分隔,也可以使用空格
分隔
<bean class="com.cj.Dog" id="dog02" name="dog,dog1,dog2"/>
xml中没有设置id或者name,默认的beanName是类的全路径com.cj.Dog
,
如果多个bean都没有配置id,和name,,默认的beanName就是类的全路径#编号
属性注入
set注入
通过无参构造方法创建,setter赋值
普通属性注入
复杂属性,数组,list,map,properties注入
<?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.xsd">
<bean class="com.cj.User" id="user">
<property name="name" value="cc"/>
<property name="address" value="chengdu"/>
<property name="age" value="1"/>
<property name="dog" ref="dog"/>
<property name="cats">
<list>
<bean class="com.cj.Cat">
<property name="name" value="瓜瓜"/>
</bean>
<ref bean="cat"/>
</list>
</property>
<property name="favorites">
<array>
<value>篮球</value>
<value>足球</value>
</array>
</property>
<property name="info">
<map>
<entry key="nation" value="汉族"/>
<entry key="edu" value="本科"/>
</map>
</property>
<property name="job">
<props>
<prop key="salary">10000</prop>
<prop key="position">java</prop>
</props>
</property>
</bean>
<bean class="com.cj.Dog" id="dog">
<property name="name" value="小黑"/>
</bean>
<bean class="com.cj.Cat" id="cat">
<property name="name" value="可乐"/>
</bean>
</beans>
构造器注入
<?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.xsd">
<bean class="com.cj.User" id="user">
<constructor-arg name="name" value="cc"/>
<constructor-arg name="dog">
<bean class="com.cj.Dog">
<property name="name" value="小黑"/>
</bean>
</constructor-arg>
<constructor-arg name="cats">
<list>
<bean class="com.cj.Cat">
<property name="name" value="瓜瓜"/>
</bean>
</list>
</constructor-arg>
<constructor-arg name="address" value="chengdu"/>
<constructor-arg name="age" value="1"/>
<constructor-arg name="favorites">
<array>
<value>篮球</value>
</array>
</constructor-arg>
<constructor-arg name="info">
<map>
<entry key="edu" value="本科"/>
</map>
</constructor-arg>
<constructor-arg name="job">
<props>
<prop key="hehe">123</prop>
</props>
</constructor-arg>
</bean>
</beans>
p名称空间,,本质是set方法
<bean class="com.cj.Dog" id="dog" p:name="小黄" p:age="1"/>
属性自动注入
autowire属性:
- no : 不自动注入。。默认为no
- byName : 根据bean的名字注入,,set注入
- byType : 根据类型注入,,,set注入
- constructor : 构造函数注入
- default : 继承父标签上的
default-autowire
<?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.xsd">
<beans default-autowire="byType">
<bean class="com.cj.Dog" id="dog">
<property name="name" value="小黑"/>
</bean>
<!-- no : 默认
byName : 根据名字注入
byType : 根据类型注入
constructor : 构造方法注入
default: 自己不决定,由他的parent标签去决定
-->
<bean class="com.cj.User" id="user" autowire="default">
<property name="name" value="cc"/>
</bean>
</beans>
</beans>
配置文件加载
- FileSystemXmlApplication : 当前项目根目录下,开始配置文件
- ClassPathXmlApplication : classpath
多个bean不写name和id,,默认的beanName
xml配置中,beanName是在DefaultBeanNameGenerator
java配置中,beanName是在AnnotationBeanNameGenerator
都是BeanNameGenerator
接口
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans04.xml");
User user = ctx.getBean("com.cj.User", User.class);
User user1 = ctx.getBean("com.cj.User#0", User.class);
User user2 = ctx.getBean("com.cj.User#1", User.class);
User user3 = ctx.getBean("com.cj.User#2", User.class);
System.out.println("user = " + user);
System.out.println("user2 = " + user2);
System.out.println("user3 = " + user3);
System.out.println(user==user1);
}
第一个com.cj.User#0 将 com.cj.User作为别名,跟#0绑定,,
后面不绑定是因为 com.cj.User 已经存在在容器中,,第一个是因为com.cj.User在容器中没有
id和name的处理
id是beanName,, name是作为别名,,
如果id没有配置, beanName是name属性的第一个,,其他name属性为别名,,,
bean的作用域
scope:
- singleton :单例,,多次取,只会是同一个实例
- prototype : 多例,,每次获取都不同
- reqeust : web环境生效, 当有一个新的请求到达的时候,会创建一个bean实例
- session : 当有一个新的会话的时候,会创建一个bean实例
- application: 在项目的整个生命周期中,只有一个bean
- globalsession : 有点类似于application,,但是这个是在portlet环境下使用
java配置scope使用@Scope()
注解
singleton和prototype区别:
- 如果scope为
singleton
,spring在启动的时候会完成初始化,,
如果是prototype
是在每一次获取bean的时候初始化 - scope为prototype的bean的生命周期 和 singleton不同
条件注解
根据条件向spring容器中注册bean,,实现Condition
接口,里面matches方法返回true表示,注入到容器中
public class JavaConfig {
@Bean
@Conditional(WindowCondition.class)
ShowCmd winCmd(){
return new WindowsCmd();
}
@Bean
@Conditional(LinuxCondition.class)
ShowCmd linuxCmd(){
return new LinuxCmd();
}
}
使用场景:
- 多环境切换
- springboot中自动配置