Spring框架之Bean的装配方式

在Spring框架中,可以使用多种方式来装配Bean,包括:

  1. XML配置文件:使用<bean>标签来定义Bean的配置信息,然后在XML配置文件中引用这些Bean。
  2. 注解:在Bean类上使用注解来标识它是一个Bean,并使用其他注解来定义Bean的属性和行为。
  3. Java配置类:使用Java类来配置Bean,通常是一个@Configuration类,使用@Bean注解来定义Bean。

        这些装配方式都可以使用单例或原型作用域,也可以使用构造函数或Setter方法来注入依赖项。选择哪种装配方式取决于开发人员的个人喜好和项目的需求。下面我只说一下XML配置方式和注解配置。

一、使用XML配置文件进行Bean的装配:

目录如下 

首先在Dao层我们创建一个UserDao接口,

package com.spring.dao;

public interface UserDao {
	void getName();
}

然后写两个类分别实现里面的方法。

UserDaoImpl类

package com.spring.dao;

public class UserDaoImpl implements UserDao{
	public void getName() {
		System.out.println("获取所有用户数据!");
	}
}

UserMysqlImpl类

package com.spring.dao;

public class UserMysqlImpl implements UserDao{
	public void getName() {
		System.out.println("获取所有Mysql用户的数据!");
	}
}

之后在业务层创建一个接口UserService

package com.spring.service;

import com.spring.dao.UserDao;

public interface UserService {
	void getName();
	void setUserDao(UserDao userdao);
}

然后创建一个UserServiceImpl类实现方法。setUserDao这个方法实现了依赖注入,也就是当我们需要使用该对象的地方,使用setUserDao方法就可以UserDao对象注入当前userdao属性中

package com.spring.service;

import com.spring.dao.UserDao;

public class UserServiceImpl implements UserService{
	UserDao userdao;
	public void setUserDao(UserDao userdao) {
		this.userdao=userdao;
	}
	public void getName() {
		userdao.getName();
	}
}

         然后我们看最重要的ApplicationContext.xml配置文件(注释上面的代码不解释可以直接复制),使用<bean>和<property>标签进行IOC容器配置。

比如<bean id="UserServiceImpl" class="com.spring.service.UserServiceImpl">

<property name="UserDao" ref="UserMysqlImpl" />

</bean>表示

        该bean的id为“UserServiceImpl”,对应的类是“com.spring.service.UserServiceImpl”。这个bean引用了之前定义的名为“UserMysqlImpl”的 bean,通过<property>元素将其注入到“UserServiceImpl”对象的“UserDao”属性中。

<?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">
	<!-- 将指定类TestDaoImpl配置给Spring,让Spring创建其实例 -->
	<bean id="UserDaoImpl" class="com.spring.dao.UserDaoImpl" />
	<bean id="UserMysqlImpl" class="com.spring.dao.UserMysqlImpl" />
	<bean id="UserServiceImpl" class="com.spring.service.UserServiceImpl">
	<property name="UserDao" ref="UserMysqlImpl" />
	
	</bean>
</beans>

        这样,当Spring IOC容器初始化时,会自动创建并注入所需的Bean对象,使得业务逻辑代码与具体实现解耦,提高了代码的可扩展性和可维护性。

然后我们写一个测试类。首先创建了一个基于XML配置文件的Spring IoC容器,然后从IoC容器中获取名为"UserServiceImpl"的Bean实例,并将其强制转换为UserServiceImpl类型,最后调用UserServiceImpl实例的getName()方法

package com.spring.servlet;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.UserServiceImpl;

public class Test {
	public static void main(String args[]) {
		ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		//容器在手,天下我有
		UserServiceImpl us = (UserServiceImpl)context.getBean("UserServiceImpl");
		us.getName();
	}
}

二、使用注解进行Bean的装配

        好的,我们刚才完成了使用xml文件进行Bean的装配,然后我们在这个基础上来使用注解对Bean进行装配。

        首先,我们来看ApplicationContext.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"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
        
	<context:component-scan base-package="com.spring.dao"/>
	<context:component-scan base-package="com.spring.service"/>

	
</beans>

        <context:component-scan base-package="com.spring.dao"/>这句代码用于自动扫描指定包下的类,将使用了@Repository注解的类注入为Bean。这里表示扫描com.spring.dao包下的类,并将使用了@Repository注解的类自动注入为Bean。

        什么意思呢?我们来看Dao层的UserDaoImpl类,他在类名前面加了一个注释@Repository("userdao"),所以表示将这个UserDaoImpl类注入Bean中。一个注解就解决的事,就不用我们前面去使用<bean>标签那么麻烦了。

package com.spring.dao;

import org.springframework.stereotype.Repository;

@Repository("userdao")
public class UserDaoImpl implements UserDao{
	public void getName() {
		System.out.println("获取所有用户数据!");
	}
}

        然后我们看业务层有什么变化 

package com.spring.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.spring.dao.UserDao;
@Service("service")
public class UserServiceImpl implements UserService{
	@Autowired
	UserDao userdao;
	@Value("张三")
	public String name;
	public void getName() {
		userdao.getName();
	}
}

        @Service("service") 表示将 UserServiceImpl 类注册到 Spring 容器中,其中 "service" 是该 bean 的 id。(service层的类要用@Service)

        @Autowired 注解要和@Repository(“userdao”)一起看,将UserDaoImpl类实例化的对象注入到userdao中(这里没有用setter方法,而是使用@Autowired进行属性注入)

        @Value("张三") 表示将属性值 "张三" 注入到 name 成员变量中

最后在测试类里

package com.spring.servlet;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.UserServiceImpl;

public class Test {
	public static void main(String args[]) {
		ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		UserServiceImpl us = (UserServiceImpl)context.getBean("service");
		us.getName();
		System.out.println(us.name);
	}
}

调用id为service的bean,调用getName()方法

输出结果如下

猜你喜欢

转载自blog.csdn.net/m0_56540237/article/details/129243742