JavaSpring Bean的装配方式详解

Spring支持三种形式的Bean的装配方式,分别基于XML的装配、基于注解的装配和自动装配。

xml装配
在这里插入图片描述
当使用无参构造方法时,必须要有set方法,且在xml文件当中使用<property>标签给定值。使用有参的构造函数在配置文件中使用<constructor-arg>标签
如下代码所示:使用不同的标签装配bean。分别是对应java代码当中是否有带参数的构造函数。

<bean id="teacher" class="com.lzq.spring.model.teacher">
		<constructor-arg index="0" value="01"></constructor-arg>
		<constructor-arg index="1" value="岳云"></constructor-arg>
		<constructor-arg index="2" value="45"></constructor-arg>
	</bean>

	<bean id="Person" class="com.lzq.spring.model.Person">
		<property name="name" value="月月鸟"></property>
		<property name="age" value="18"></property>
	</bean>

如下图所示,在teacher类和person类当中,对变量进行封装的方法,一个是无参构造函数(或者是无构造函数)使用set方法,有参的直接this.变量获取
在这里插入图片描述
基于注解的装配
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
主要注释有以下几种:前四个表示在该注解下的类是一个Bean

  • @Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。
  • @Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。
  • @Service:用于将业务层(Service)的类标识为Spring中的Bean。
  • @Controller:用于将控制层(Controller)的类标识为Spring中的Bean 。
  • @Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对-应的注解处理器完成Bean的自动配置工作。
  • @Resource:其作用与Autowired一样。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。
  • @Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

怎么使用注释装配呢。下面举一个简单的例子。
首先可以先定义一个接口,在接口当中写入一个方法。

public interface dao {
	public void dao1();
}

接着定义一个类继承这个接口,并且加上注释装配。加上装配时需要导入相对应的包。如下所示

package 装配;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
@Repository("Service") 
public class Service implements dao {
	@Override
	public void dao1() {
		System.out.println("方法重载 service============");
	}
	public void ser() {
		System.out.println("dao+ser");
	}
}

在接下来就是在配置文件当中进行配置,需要改变一下< bean> 如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                       
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

以及配置一下Bean,如下所示:

<context:annotation-config />
   <bean id="Service" class="装配.Service" />

最后定义一个测试类:调用Service类的方法。

package com.lzq.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import 装配.Service;
public class annotationtest {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Service s = (Service)ac.getBean("Service");
		s.dao1();
		s.ser();
	}	
}

如下图:看一下运行结果:(在这里因为在配置文件当中还有其他配置,输出的语句就最后俩行是该程序的输出结果)
在这里插入图片描述
除了可以像示例中通过元素来配置Bean外,还可以通过包扫描的形式来配置一个包下的所有Bean:

<context:component-scan base-package="com.itheima.annotation" />

自动装配
就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:
在这里插入图片描述

发布了285 篇原创文章 · 获赞 39 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_44973159/article/details/104745456
今日推荐