一、基于XML的装配
基于XML的装配,Spring提供了两种装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。
设值注入要求Bean必须满足一下要求:
(1)Bean类必须提供一个默认的无参构造方法;
(2)Bean类必须为需要注入的属性提供对应的setter方法;
设值注入时,需要Spring在配置文件中,需要使用元素的子元素来为每个属性注入值;
使用构造方法时,在配置文件里,需要使用元素的子元素来定义构造方法的参数,可以使用value属性(或者子元素)来设值该参数的值。
User.java
package com.itheima.assemble;
import java.util.List;
public class User {
private String username;
private Integer password;
private List list;
/**
* 1.使用构造注入
* 1.1提供带所有参数的有参构造方法
*/
public User(String username, Integer password, List list) {
super();
this.username = username;
this.password = password;
this.list = list;
}
/**
* 2.使用设值注入
* 2.1 提供默认空参构造fangfa
* 2.2为所有属性提供setter方法
*/
public User() {
super();
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(Integer password) {
this.password = password;
}
public void setList(List list) {
this.list = list;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", list=" + list + ", toString()="
+ super.toString() + "]";
}
}
XmlBeanAssembleTest.java
package com.itheima.assemble;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class XmlBeanAssembleTest {
public static void main(String[] args) {
/*定义配置文件路径*/
String xmlPath ="com/itheima/assemble/beans5.xml";
/*加载配置文件*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
/*构造方式输出结果*/
System.out.println(applicationContext.getBean("user1"));
/*设置方式输出结果*/
System.out.println(applicationContext.getBean("user2"));
}
}
beans5.xml
"constructorvalue1"
"constructorvalue2"
"setlistvalue1"
"setlistvalue2"
二、基于Annotation的装配
在实际应用中如果有很多Bean时,还通过使用XML配置会导致臃肿,给后续的维护和升级带来一定的困难。Spring提供了对Annotation注解技术的全面支持,可以解决此困难。
Spring常用注解如下:
Component | 描述Spring中的Bean,但是它时一个泛化的概念,仅仅表示一个组件(Bean)并且可以作用在任何层次; |
---|---|
Repository | 用于将数据访问层(DAO)层的类标识为Spring中的Bean |
Service | 作用在业务层(service层),用于将业务层的类标识为Spring中的Bean |
Controller | 作用在控制层(如Spring MVC 的 controller层),用于将控制层的类标识为Spring中的Bean |
Autowired | 用于对Bean的属性变量、属性setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作 |
Resourse | 作用与Autowired一样。Resourse两个重要的属性:name和type。Spring将name解析为Bean实例名称,type解析为Bean实例类型 |
示例代码如下:
UserDao.java
package com.itheima.annotation;
public interface UserDao {
public void save();
}
UserDaoImpl.java
package com.itheima.annotation;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("userdao...save...");
}
}
UserService .java
package com.itheima.annotation;
public interface UserService {
public void save();
}
UserServiceImpl.java
package com.itheima.annotation;
import javax.annotation.Resource;
import javax.swing.Spring;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao userDao;
/*Spring Bean的自动装配方式,需要在Controller和ServiceImpl增加setter方法, 即如下代码*/
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
/*调用userDao中的save方法*/
this.userDao.save();
System.out.println("userservice...save...");
}
}
UserController.java
package com.itheima.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
@Controller("userController")
public class UserController {
@Resource(name="userService")
private UserService userService;
/*Spring Bean的自动装配方式,需要在Controller和ServiceImpl增加setter方法, 即如下代码*/
public void setUserService(UserService userService) {
this.userService = userService;
}
public void save() {
this.userService.save();
System.out.println("userController...save...");
}
}
AnnotationAssemTest.java
package com.itheima.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnotationAssemTest {
public static void main(String[] args) {
/*定义配置文件路径*/
String xmlPath = "com/itheima/annotation/beans6.xml";
/*加载配饰文件*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
/*获取UserController实例*/
UserController userController = (UserController) applicationContext.getBean("userController");
/*调用UserController中的save()方法*/
userController.save();
}
}
beans6.xml
使用此时一定要添加包 Spring-aop-4.3.6.RELEASE.jar,否则将会报错哦!!!
三、自动装配
自动装配,就是将一个bean自动地注入到其他Bean的property中。
仿造如上示例二代码,在ServiceImpl.java和UserController.java中加入属性的Setter方法。
beans6.xml文件改为如下