目录
一、Bean的配置
如果把Spring看做一个大型工厂,则Spring容器中的Bean就是该工厂的产品。要想使用这个工厂生产和管理Bean,就需要在配置文件中告诉它需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。
小提示: Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理 Bean
二、Bean的实例化
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。
对应Java基础中的创建对象的方式:
假如有一个类Bean1
创建一个Bean1类的对象
(1)Bean1 bean = new Bean1();
(2)Bean1Factory
//静态
public static Bean1 creatBean1(){
return new Bean1();
}
Bean1Factory.creatBean1();//创建Bean1的对象的方法
(3)Bean1Factory
//非静态
public Bean1 creatBean1(){
return new Bean1();
}
Bean1Factory bean1factory = new Bean1Factory();
bean1factory .creatBean1();
1、构造器实例化
构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数来实例化Bean。接下来演示构造器实例化的使用:
(1)创建Web项目,导入相关Jar包;
(2)创建名为Bean1的Java类;
/**
* 空类默认有什么?
* 1.默认继承了Object类
* 2.有一个默认无参构造方法
* */
public class Bean1 {
}
(3)创建Spring配置文件beans1.xml,并配置Beanl实体类Bean;
<?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="bean1" class="com.ssm.Bean1" scope="prototype"></bean>
<!--scope="singleton" 地址相同 scope="prototype" 创建新的 地址不同-->
</beans>
(4)创建测试类,测试程序。
public class Test {
public static void main(String[] args) {
//1.加载xml配置文件,初始化容器
String xmlPath = "com/ssm/Bean1.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
//2.通过容器获取实例对象
Bean1 bean1 =(Bean1) applicationcontext.getBean("bean1");//3.使用实例对象
system.out.println(bean1);// system.out.println(bean1.tostring);
}}
(5)输出结果
【com.ssm.Bean1@3a03464】
2、静态工厂方式实例化
静态工厂是实例化Bean的另一种方式。该方式要求自己创建一个静态工厂的方法来创建Bean的实例。接下来演示静态工厂实例化的使用:
(1)创建名为Bean2的Java类;
public class Bean2 {
}
(2)创建一个Java工厂类,在类中使用静态方法获取Bean2实例;
public class MyBean2Factory {
public static Bean2 createBean2() {
return new Bean2();
}}
(3)创建Spring配置文件beans2.xml,并配置工厂类Bean;
<?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="bean2" class="com.ssm.static_factory.MyBean2Factory"
factory-method="createBean2"></bean></beans>
(4)创建测试类,测试程序。
public class Testioc {
public static void main(String[] args) {
//1.加载xml配置文件,初始化容器
String xmlPath = "com/ssm/static_factory/Bean2.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
//2.通过容器获取实例对象
Bean2 bean2 =(Bean2)applicationContext.getBean("bean2");
//3.使用实例对象
System.out.println(bean2);
}}
(5)输出结果
【com.ssm.static_factory.Bean2@13a57a3b】
3、实例工厂方式实例化
该方式不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方法。接下来演示实例工厂方式实例化的使用:
(1)创建名为Bean3的Java类;
public class Bean3 {
}
(2)创建一个Java工厂类,在类中使用非静态方式获取Bean3实例;
public class MyBean3Factory {
public Bean3 creatBean3() {
return new Bean3();
}
}
(3)创建Spring配置文件beans3.xml,并配置工厂类Bean;
<?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="myBean3Factory" class="com.ssm.factory.MyBean3Factory"></bean>
<bean id="bean3" factory-bean="myBean3Factory" factory-method="creatBean3"></bean></beans>
(4)创建测试类,测试程序。
public class Testioc {
public static void main(String[] args) {
//1.加载xml配置文件,初始化容器
String xmlPath = "com/ssm/factory/Bean3.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
//2.通过容器获取实例对象
Bean3 bean3 =(Bean3)applicationContext.getBean("bean3");
//3.使用实例对象
System.out.println(bean3);
}}
(5)输出结果
【com.ssm.factory.Bean3@13a57a3b】
三、Bean的作用域
singleton和prototype是最常用的两种作用域。【没写默认singleton单例模式】
四、Bean的生命周期
Spring容器可以管理Bean部分作用域的生命周期。
五、Bean的装配方式
Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),将主要讲解这三种装配方式的使用。
(1)基于XML的装配
(1)创建Java类,提供有参、无参构造以及属性setter方法;
【快捷键:右击空白处-->Source-->Generate Constructor using Fields.../
Generate Constructors from Superclass.../Generate Getters and Setters...】
public class User {
private String username;
private String password;
private List<String> list;
public User(String username, String password,List<String> list) {
super();
this.username = username;
this.password = password;
this.list = list;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String 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 + "]";
}
}
(2)创建Spring配置文件beans5.xml,使用2种方式配置Bean;
<?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">
<!--用构造注入方式装配User对象 -->
<bean id="user1" class="com.ssm.assemble.User">
<constructor-arg index="0" value="张三"></constructor-arg>
<constructor-arg index="1" value="123456"></constructor-arg>
<constructor-arg index="2">
<list>
<value>"张四"</value>
<value>"张五"</value>
<value>"张六"</value>
</list>
</constructor-arg>
</bean>
<!-- 用设置注入 -->
<bean id="user2" class="com.ssm.assemble.User">
<property name="username" value="李四"></property><!--name的值是类的成员属性 -->
<property name="password" value="654321"></property>
<property name="list">
<list>
<value>"李四"</value>
<value>"李五"</value>
<value>"李六"</value>
</list>
</property>
</bean>
</beans>
(3)创建测试类,测试程序。
public class Testioc {
public static void main(String[] args) {
//1.加载xml配置文件,初始化容器
String xmlPath = "com/ssm/assemble/Bean5.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
//2.通过容器获取实例对象
User user1 =(User) applicationContext.getBean("user1");
//3.使用实例对象
System.out.println(user1);
User user2 =(User) applicationContext.getBean("user2");
//3.使用实例对象
System.out.println(user2);
}}
(2)基于注解(Annotation)的装配
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带束一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
@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注解的参数指定。
---------------------------------------------------------------UserDao.java
public interface UserDao {
void save();
}---------------------------------------------------------------UserDaoImpl.java
//@Repository("userDao")--相当于new了对象,不用bean了
@Repository//默认名字是类名首字母小写userDaoImpl
public class UserDaoImpl implements UserDao{@Override
public void save() {
System.out.println("userDao...save...");
}}
------------------------------------------------------------------------UserService.java
public interface UserService {
void save();
}--------------------------------------------------------------------------UserServiceImpl.java
//@Service("userService")
@Service
public class UserServiceImpl implements UserService{
//@Resource(name="userDao")//实例对象
//@Resource
@Autowired//@Resource和@Autowired都行,经常用Autowired
private UserDao userDao;//属性@Override
public void save() {
this.userDao.save();
System.out.println("userService...save...");
}}
------------------------------------------------------------------------------------UserController.java
//@Controller("userController")
@Controller
public class UserController {
//@Resource(name="userService")
@Autowired
private UserService userService;
public void save() {
this.userService.save();
System.out.println("userController...save...");
}
}-------------------------------------------------------------------------------------Bean6.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"
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">
<!-- 开启注解,用到context约束 -->
<context:annotation-config></context:annotation-config>
<!-- <bean id="userDao" class="com.ssm.annotation.UserDaoImpl"></bean>
<bean id="userService" class="com.ssm.annotation.UserServiceImpl"></bean>
<bean id="userController" class="com.ssm.annotation.UserController"></bean> -->
<!-- 扫描包下所有东西 -->
<context:component-scan base-package="com.ssm.annotation"></context:component-scan>
</beans>-----------------------------------------------------------------------------------------Testioc.java
public class Testioc {
public static void main(String[] args) {
//1.加载xml配置文件,初始化容器
String xmlPath = "com/ssm/annotation/Bean6.xml";
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath);
//2.通过容器获取实例对象
UserController userController =(UserController) applicationContext.getBean("userController");
userController.save();
}}
结果
用到的jar包