在Spring框架中,可以使用多种方式来装配Bean,包括:
- XML配置文件:使用<bean>标签来定义Bean的配置信息,然后在XML配置文件中引用这些Bean。
- 注解:在Bean类上使用注解来标识它是一个Bean,并使用其他注解来定义Bean的属性和行为。
- 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()方法
输出结果如下