Spring自学日志03(作用域,自动装配)

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;
}
发布了20 篇原创文章 · 获赞 0 · 访问量 203

猜你喜欢

转载自blog.csdn.net/qq_43697752/article/details/103579474
今日推荐