Spring中Bean对象的创建和注入

一、Bean的创建

1、构造方法创建

方法:无参构造函数+字段的setter方法

注:我们不必在类中写任何构造函数,编译器会自己生成一个默认构造函数,如果我们 写了有参构造函数,就不会自动创建无参构造,也就不会创建Bean对象。

直接上代码:

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.xsd">
    
<bean id="accountService" class="com.jc.service.impl.AccountServiceImpl"></bean>
</beans>

2、普通工厂中的方法创建

InstanceFactory类

/**
 * 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)
 */
public class InstanceFactory {

  public IAccountService getAccountService(){
    return new AccountServiceImpl();
  }
}

xml配置

<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

3、工厂中的静态方法创建

StaticFactory类

/**
 * 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)
 */
public class StaticFactory {
  public static IAccountService getAccountService(){
    return new AccountServiceImpl();
  }
}
<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>

4、注解创建对象

在创建对象的类上面使用注解就可以实现。

创建对象有四个注解。

@Conmponent
@Controller web层
@Service 业务层
@Repository 持久层

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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
        <!-- bean definitions here -->
    <!-- 
        开启注解的扫描,扫描类,方法,属性上面的注解
    -->
    <context:component-scan base-package="cn"></context:component-scan>
</beans>

二、Bean的注入

1、构造器注入

使用的标签:constructor-arg;
标签出现的位置:bean标签的内部;

标签中的属性
type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name:用于指定给构造函数中指定名称的参数赋值
=以上三个用于指定给构造函数中哪个参数赋值

​ value:用于提供基本类型和String类型的数据
​ ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

优势:
在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
弊端:
改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value="泰斯特"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
    <!--date不是基本类型也不是String 如果使用vlaue="now"会报错-->
</bean>

<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>

2、setter方式注入(更常用)

如果要注入某个类的对象,需要创建set方法,如service中要用到dao成员变量,就要给这个dao创建set方法。

涉及的标签:property
出现的位置:bean标签的内部
标签的属性
name:用于指定注入时所调用的set方法名称
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

优势:
创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:
如果有某个成员必须有值,则获取对象是有可能set方法没有执行。

Person类

public class Person {

    private String name;
    private int age;
    private Date birthday;
    
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
    public void  saveAccount(){
        System.out.println("service中的saveAccount方法执行了..."+name+","+age+","+birthday);
    }
   }
<bean id="accountService2" class="com.itheima.domain.Person">
    <property name="name" value="TEST" ></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
</bean>
<!--name值是set方法名去掉set并都改为小写-->

3、注解方式注入

各注解说明:

1、Autowired:
作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
如果Ioc容器中有多个类型匹配时:
出现位置:
可以是变量上,也可以是方法上
细节:
在使用注解注入时,set方法就不是必须的了。

2、Qualifier:
作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(稍后我们讲)
属性:
value:用于指定注入bean的id。
3、Resource
作用:直接按照bean的id注入。它可以独立使用
属性:
name:用于指定bean的id。
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
另外,集合类型的注入只能通过XML来实现。

4、Value
作用:用于注入基本类型和String类型的数据
属性:
value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
SpEL的写法:${表达式}

例:

public class UserService{
	@autowired
	private UserDao userDao;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值