使用spring框架的过程
1、导入依赖
<!-- Spring的核心工具包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!--在基础IOC功能上提供扩展服务,还提供许多企业级服务的支持,有邮件服务、 任务调度、远程访问、缓存以及多种视图层框架的支持-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring IOC的基础实现,包含访问配置文件、创建和管理bean等 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring context的扩展支持,用于MVC方面 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- Spring表达式语言 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
2、配置xml文件
beans表示的是多个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.xsd">
</beans>
声明格式:
<bean id="对象名" class="类的完整路径">
<property name="属性名" ref="对象的id值"></property>
</bean>
实战演示:
<!--IOC统一管理、统一分配-->
<bean id="daoImpl" class="com.xzk.dao.impl.UserDaoImpl"></bean>
<bean id="serviceImpl" class="com.xzk.service.impl.UserServiceImpl">
<property name="dao" ref="daoImpl"></property>
</bean>
批注:
上面代码中property的内容是怎么来的?
因为在serviceImpl中我们都知道,service是调用dao的,所谓的调用就是在service类中new了一个dao对象,或者说创建了一个dao对象。
我们在配置文件中配置的bean,如果没有property,表示的只是将对象的管理交给了IOC容器,现在IOC容器的功能,如果说没有property的功能是只具备创建对象的功能,而且是调用对象的无参构造方法
我们的service层需要的功能是在一个service类中创建一个dao的对象,有点类似于嵌套的关系。为了表示一种依赖的关系,我们就在bean中指定property表示另外一个对象,ref 指的是另外一个bean对象
达到在一个对象中调用另外一个对象的需求
当容器给属性赋值时,默认调取 set方法,意思说在创建属性时,如果是私有属性,我们就需要给属性一个set方法
3、配置文件写好之后,如何获取需要的对象
//加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
//通过getBean(“对象的ID”)这个方法得到指定的对象
UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("serviceImpl");
serviceImpl.insertUser1(new User());
bean标签创建对象是调用对象的构造方法进行创建的
注意,这里的构造方法可以是无参构造,也可以是有参构造方法,无参构造我们不需要指定参数,使用上面的方法就可以了
问题深入:bean标签中如何调用有参构造方法
调用有参构造,我们就需要在bean标签中加上参数
比如我们的bean对象User,有两个参数,并创建出全参的构造方法,我们在bean中应该如何配置才能使用呢?
constructor-arg 参数使用index指定下标,使用value值指定参数的值
<bean id="u2" class="com.xzk.bean.User">
<constructor-arg index="0" value="zaSan"></constructor-arg>
<constructor-arg index="1" value="17"></constructor-arg>
</bean>
问题延伸:bean标签中如何调取静态方法
比如User对象里包括一个获取学生类的静态方法
XML中的bean对象如何配置呢?
这里使用的是静态工厂模式
factory-method 指定类中的静态方法
<bean id="u3" class="com.xzk.bean.User" factory-method="getStudent"></bean>
问题延伸:bean标签中如何调取非静态方法
<bean id="u4" class="com.xzk.bean.User"></bean>
<bean id="u5" factory-bean="u4" factory-method="getStudent2"></bean>
我们在获取的时候,获取的是 u5
总结:
我们使用bean创建对象的几种方式
- 无参构造
- 有参构造
- 静态方法
- 非静态方法