Spring中的bean

一、IoC概念:IoC是Inversion of Control 的缩写,译为“控制反转”;我们之前创建对象的时候,使用的是实例化方式,通过new关键字创建对象。Spring中的IoC方式对象的生命周期由Spring框架提供的Ioc容器来管理,将控制权交给了Ioc容器,也就是借助第三方实现具有依赖关系对象之间的解耦。使对象与对象之间没有什么直接联系。

二、bean的装配方式

1、基于XML装配

在Spring的IoC容器中,beans是常见的一个标签,它用来管理bean;对bean的管理是在配置文件中进行的,使用xml文件的形式。文件中包含bean的id、类、属性以及值。

bean 中常用的属性和子元素:

id:是bean的唯一标识,Spring容器对bean的配置,管理够通过该属性进行。

class:是指定bean的实现类,它必须使用类的权限定名

scope:用来设定bean实例的作用域,其属性值有singleton(单例)、prototype(原型)、websocket等,默认值是singleton

constructor-arg:bean元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号,type指定构造参数的类型,参数值可以通过ref或value指定。

property:bean元素的子元素,用于调用bean实例中的setter()方法完成属性赋值,从而完成依赖注入。该元素的name属性指定bean实例中相应的属性名,ref属性或者value属性用来指定参数值。

ref:<constructor-arg>、<property>等元素的属性或者子元素,可以用于指定对bean工厂中某个bean实例的引用。

value:<constructor-arg>、<property>等元素的属性或子元素,可以用于定义一个常量的值。

 

Spring中提供了两种基于xml的装配方式, 构造注入和设值注入

构造方法注入使用的是<constructor-arg> 使用value来设置参数的值。

设值注入使用的是<property>,使用value来设置参数的值。

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"
       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 id="user1" class="com.itheima.service.impl.User">
        <constructor-arg index="0" value="zhangsan" ></constructor-arg>
        <constructor-arg index="1" value="18"></constructor-arg>
        <constructor-arg index="2" >
            <list>
                <value>"constructorValue1"</value>
                <value>"constructorValue2"</value>
            </list>
        </constructor-arg>
    </bean>


<!--使用setter方法进行注入-->
    <bean id="user2" class="com.itheima.service.impl.User">
        <property name="userName" value="lisi"></property>
        <property name="age" value="19"></property>
        <property name="list">
            <list>
                <value>"listValue1"</value>
                <value>"listValue2"</value>
            </list>
        </property>

    </bean>
</beans>

业务层代码:

package com.itheima.service.impl;

import java.util.List;
import lombok.Data;

/**
 * @version 1.0
 * @Description
 * @Author 
 * @CreateDate 2020/11/8 17:21
 * @UpdateUser
 * @UpdateDate
 * @UpdateRemark
 */

public class User {
    private String userName;
    private String age;
    private List<String> list;

    /**
    * @Describe 使用构造注入,提供带参数的构造方法
    * @Author 
    * @Date 2020/11/8 19:00
    * @param [userName, age, list]
    * @Return * @return:null
    */
    public User(String userName,String age,List<String> list){
        this.userName=userName;
        this.age=age;
        this.list=list;
    }


    public User(){
        super();
    }

    //使用setter方法
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age='" + age + '\'' +
                ", list=" + list +
                '}';
    }
}

Client类:

package com.itheima.ui;


import com.itheima.service.IAccountService;
import com.itheima.service.impl.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @ClassName:
 * @description:
 * @Author:
 * @UpdateUser:
 * @Datetime:2020/8/15 16:51
 */
public class Client {

    public static void main(String[] args) {
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

        //2、根据id获取Bean对象
        User user =(User) ac.getBean("user1");
        User user =(User) ac.getBean("user2");

    }
}

2、基于注解的装配

@Componet、@Respository、@Service、@Controller 这四个注解的功能一样,但是为了是注解用途更加清晰,在不同的层使用不同的注解。用这四个注解标识的类,说明此类是一个bean

@Autowired、@Resource 这两个注解功能一样,相当于对变量进行注入。

Service层代码:

package com.itheima.service.impl;

import com.itheima.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @version 1.0
 * @Description
 * @Author 
 * @CreateDate 2020/11/8 19:26
 * @UpdateUser
 * @UpdateDate
 * @UpdateRemark
 */
//使用@Service注解将UserServiceImpl类标识为Spring中的bean
@Service("userService")
public class UserServiceImpl implements UserService {

    //使用@Resource注解注入
    @Resource(name="userDao")
    private UserDao userDao;
}

如上代码,首先使用@Service注解将UserServiceImpl类标示为Spring中的bean,这相当于配置文件中的

<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">

然后使用@Resource注解标注在属性userDao中,这相当于配置文件中的

<property name="userDao" ref="userDao"></property>
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值