Bean的装配方式

一、基于XML的装配方式

  (1)设值注入

    1.Bean类必须有一个无参构造方法。

    2.Bean类必须为属性提供setter方法。

  (2)构造注入

    1.Bean类必须提供有参构造方法。

  代码如下:

User.java文件

package com.itheima.assemble;

import java.util.List;

public class User {
private String username;
private Integer password;
private List<String> list;

// 使用构造注入 提供带所有参数的有参构造方法

public User(String username, Integer password, List<String> list) {
super();
this.username = username;
this.password = password;
this.list = list;
}
// 使用设值注入 提供默认空参构造方法 为所有属性提供set方法
public User(){
super();
}

public void setUsername(String username) {
this.username = username;
}

public void setPassword(Integer password) {
this.password = password;
}

public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", list=" + list + "]";
}
}

 

beans2.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 使用构造注入方法 -->
<bean id="user1" class="com.itheima.assemble.User">
<constructor-arg index="0" value="tom"></constructor-arg>
<constructor-arg index="1" value="123456"></constructor-arg>
<constructor-arg index="2">
<list>
<value>"constructvalue1"</value>
<value>"constructvalue1"</value>
</list>
</constructor-arg>
</bean>
<!-- 使用设值注入 -->
<bean id="user2" class="com.itheima.assemble.User">
<property name="username" value="张三"></property>
<property name="password" value="654321"></property>
<property name="list">
<list>
<value>"setlistvalue1"</value>
<value>"setlistvalue2"</value>
</list>
</property>
</bean>
</beans>

 

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) {
// TODO Auto-generated method stub
// 配置文件路径
String XmlPath="com/itheima/assemble/beans2.xml";
// 加载配置文件 实例化Bean
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(XmlPath);
// 构造方法输出
System.out.println(applicationContext.getBean("user1"));
// 设值方法输出
System.out.println(applicationContext.getBean("user2"));

}

}

输出结果如下:

 

 

二、基于Annotation(注解)的装配方式

  主要注解:

    @Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。

    @Repository:用于将数据访问层(Dao)的类标识为Spring中的Bean。

    @Service:用于将业务层(Service)的类标识为Spring中的Bean。

    @Controller:用于将控制层(Controller)的类标识为Spring中的Bean。

    @Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。(简单来说就是自动配置,把所有的@Resource换成@Autowire就好了,Resource还得写name、type啥的,Autowire就比它简便)

    @Resource:作用与Autowired一样。@Resource中有两个重要的属性:name和type。String将name属性解析为Bean实例名称,type属性解析为Bean实例类型。

    @Qualifier:与@Autowired配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

 

  代码如下:

UserDao.java文件

package com.itheima.com.annotation;

public interface UserDao {
public void save();
}


UserDaoImpl.java文件

package com.itheima.com.annotation;

import javax.xml.ws.RespectBinding;

import org.springframework.stereotype.Repository;

@Repository("useDao")
public class UserDaoImpl implements UserDao {

@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("UserDao...save..");
}

}


 

UserService.java

package com.itheima.com.annotation;

public interface UserService {
public void save();
}


UserServiceImpl.java文件

package com.itheima.com.annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao userDao;
@Override
public void save() {
// TODO Auto-generated method stub
// 调用userDao中的save()方法
this.userDao.save();
System.out.println("userservice...save...");
}

}


package com.itheima.com.annotation;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

@Controller("userController")
public class UserController {

@Resource(name="userService")
private UserService userService;
public void save(){
this.userService.save();
System.out.println("userController...save...");
}
}


AnnotationTest.java文件

package com.itheima.com.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnotationTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义配置文件路径
String xmlPath="com/itheima/com/annotation/beans3.xml";
// 加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
// 获取UserController实例
UserController userController=(UserController) applicationContext.getBean("userController");
// 调用UserController中的save()方法
userController.save();
}

}


运行结果如下:

 

 

 三、自动装配

 

程序里面我本来想把<context:annotation-config/>替换成<context:component-scan base-package="com.itheima.com.annotation"/>,这样就可以让xml文件显得更加简单一点,结果不知道为什么换了之后它就找不到userDao了,然后再加上我电脑可能有些不给力,光运行测试文件就得等老半天,我就没有去试了。按理说应该程序是对的。等我过段时间换台电脑再来试试。今天学习了Spring中Bean的定义,作用域,生命周期,装配方式。下次就开始学习AOP啦。然后就是Mybatis,SpringMVC。最近看博客看到了一个叫light4j的框架也有些感兴趣。接下来的一段时间里多敲代码多敲代码多敲代码。真的是好记性不如烂笔头,上课学多少知识都不如自己安安静静敲一两个小时的代码管用。

加油!

 

posted @ 2020-07-17 22:15  南巷北口  阅读(276)  评论(0)    收藏  举报