1、bean的作用域
在XML文件中,bean对象后面加一个scope便可以知道这个bean的作用域,但是在Spring中默认为单例
1.1、当scope=singleton时为单例
<bean id="myBean" class="com.wang.pojo.MyBean" scope="singleton"></bean>
1.2、当scope=prototype时为多例
<bean id="myBean" class="com.wang.pojo.MyBean" scope="prototype"></bean>
除此之外还有,request
和session
作用域。(^▽^)(还没学)
1.3、bean的一个周期:
底层的bean是如何执行?
- 执行无参数的构造
- 执行set方法设置属性值
- 在初始化方法前添加前置处理器
- 执行初始化方法
- 在初始化方法后添加后置处理器
- 获取创建Bean的实例对象
- 执行销毁方法(context.close执行即完成销毁)
注:这也是为什么要写set和get方法
O(∩_∩)O哈哈~不过IDEA快捷键(alt+insert一键生成set和get方法,我一次都没自己手写过)
2、xml自动装配
写一个测试的person类:
public class Person {
private Cat cat;
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
}
2.1、byName装配
Bean的id值必须与类中变量名一致
<bean id="cat" class="Cat"/>
<bean id="dog" class="Dog"/>
自动装配
<bean id="person" class="Person" autowire="byName">
<property name="name" value="kimihua"/>
</bean>
就是在bean中加一个autowire
2.2、byType装配
注:不能有相同类型的Bean
<bean id="person" class="Person" autowire="byType">
<property name="name" value="kimihua"/>
</bean>
2.3、利用注解自动装配
前提:在spring4之后,想要使用注解形式,必须得要引入aop的包,而且在配置文件当中,还得要引入一个context约束。
完整配置文件:
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
好了,可以开始注解操作了||ヽ( ̄▽ ̄)ノミ|Ю(事真多)
首先在xml文件中打开注解支持,如下:
<context:component-scan base-package="org.example"/>
这个意思就是:扫描该目录下的所有包,这样加了注解之后就可以被发现。
完整的xml的文件呢:
<context:component-scan base-package="org.example"/>
<bean id="cat" class="com.demo.pro.Cat"/>
<bean id="dog" class="com.demo.pro.Dog"/>
<bean id="person" class="com.demo.pro.Person"/>
然后在测试person类中加上@Autowired
public class Person {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
public Cat getCat() {
return cat;
}
// public void setCat(Cat cat) {
// this.cat = cat;
// }
public Dog getDog() {
return dog;
}
// public void setDog(Dog dog) {
// this.dog = dog;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
}
小贴士:
利用注解的方式写,可以不用set方法。
^_(^▽^)好像挺方便的!!!
2.4、其他注解
2.4.1、@Qualifier
按名称自动装配(byName){不能单独使用,需跟@Autowired()搭配使用}
@Autowired()匹配多个类型的值时可使用@Qualifier()取出其中一个
@Autowired
@Qualifier(value = "str")
private String str;
2.4.2、@Resource
实现方式:先进行byName查找 失败;再进行byType查找
public class User {
//如果允许对象为null,设置required = false,默认为true
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String name;
}