bean的作用域
Singleton(单例模式,是默认spring的)
<bean id ="user2" class="com.injection.User" c:name="雷志明" c:age="78" scope="singleton"/>
import com.injection.Student;
import com.injection.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] arsg){
ApplicationContext context2 = new ClassPathXmlApplicationContext("Userbean.xml");
User user = context2.getBean("user2",User.class);
System.out.println(user.toString());
ApplicationContext context3 = new ClassPathXmlApplicationContext("Userbean.xml");
User user2 = context2.getBean("user2",User.class);
System.out.println(user2.toString());
System.out.println(user2==user);//都取user2,但是取两次就创建两个不同的对象
}
}
/*结果
User{name='雷志明', Age=78}
User{name='雷志明', Age=78}
true
*/
prototype(原型模式,是默认spring的)
从容器中取相同值是会创建两个不同的对象
每次get都会创建一个新的的对象
<bean id ="user2" class="com.injection.User" c:name="雷志明" c:age="78" scope="prototype"/>
测试
import com.injection.Student;
import com.injection.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] arsg){
ApplicationContext context2 = new ClassPathXmlApplicationContext("Userbean.xml");
User user = context2.getBean("user2",User.class);
System.out.println(user.toString());
ApplicationContext context3 = new ClassPathXmlApplicationContext("Userbean.xml");
User user2 = context2.getBean("user2",User.class);
System.out.println(user2.toString());
System.out.println(user2==user);//都取user2,但是取两次就创建两个不同的对象。
}
}
/*结果
User{name='雷志明', Age=78}
User{name='雷志明', Age=78}
false
*/
bean的自动装配
自动装配是Spring满足Bean依赖的一种方式!
Spring会在上下文中自动寻找,并自动给bean装配属性!
有三种自动装配方式
1.在XML中显示的配置
2.java中显示配置
3.隐式的自动装配bean
环境搭建
people类
package com.injection;
public class people {
private Cat cat;
private Dog dog;
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;
}
@Override
public String toString() {
return "people{" +
"cat=" + cat.rshout() +
", dog=" + dog.rshout() +
", name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
private String name;
}
Dog类
package com.injection;
public class Dog {
public String rshout(){
return "汪汪汪";
}
public void shout(){
System.out.println("汪汪汪");
}
}
Cat类
package com.injection;
public class Cat {
public String rshout(){
return "喵喵喵";
}
public void shout(){
System.out.println("喵喵喵");
}
}
用byName自动装配(set方法注入)
能在容器中的上下文中查找,和自己set方法值对应的bean注入!
<bean id="cat" class="com.injection.Cat"/>
<bean id="dog" class="com.injection.Dog"/>
<bean id="people" class="com.injection.people" p:name="陈声铭" autowire="byName"/>
用byType自动装配(类型全局唯一,可以省略ID)
能在容器中的上下文中查找,和自己对象属性类型相同的bean注入!
<bean id="cat" class="com.injection.Cat"/>
<bean id="dog" class="com.injection.Dog"/>
<!--
<bean id="dog2" class="com.injection.Dog"/>有两个Dog类会报错,类型全局唯一
-->
<!--<bean class="com.injection.Dog"/>可以省略ID,有类型就可以-->
<bean id="people" class="com.injection.people" p:name="陈声铭" autowire="byType"/>
用注解自动装配(不需要set有方法,也可以操作。只要你装配的属性在IOC容器中,且名字一致[参考byName])
先导入context约束
xmlns:context="http://www.springframework.org/schema/context"
<!--配置注解支持-->
<context:annotation-config/>
@Autowired直接在类属性上操作
@AutoWired注解默认应该是Bytype类型查找,找不到再Byname找两个都失败才会报错
package com.injection;
import org.springframework.beans.factory.annotation.Autowired;
public class people {
//required为false说明这个对象可以为Null,反之不行。
@Autowired(required=false)//用注解自动装配bean,
private Cat cat;
@Autowired//用注解自动装配bean
@Qualifier(value = "dog")//在类型一致的情况下指定id="dog"的bean,和@Autowired搭配使用
private Dog dog;
在使用上@Resource和@Autowired一样,但@Resource性能更强
@Resource先默认byName失败后在byType两个都失败才会报错
package com.injection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.Resource;
public class people {
@Resource(name = "cat")//指定id="cat"的bean
private Cat cat;
@Resource//用注解自动装配bean
private Dog dog;
private String name;
@Scope()//该类的作用域
@Scope("singleton")//该类的作用域
public class User {
private String name;
}
补充
@Nullable:字段标记了这个注解,说明这个字段可以为null。
//cat可以为空,用来避免报错
public void setCat(@NullableCat cat) {
this.cat = cat;
}