什么是spring
spring是javaweb开发的一个框架,为了解决企业应用开发的复杂性。
它有几个重要的特性
- IoC
- DI
- AOP
如何使用
IDEA中集合成了spring,可以直接在里面创建,引入相关的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.2</version>
</dependency>
</dependencies>
在spring当中,不用new来获得对象,而是通过:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userServiceImpl = (UserService) context.getBean("userServiceImpl");
获得实现类。
beans.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.xsd">
<bean id="..." class="..."> (1) (2)
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
内部属性的赋值也是通过内部传值来完成
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
此外还需要在bean.xml中使用ref属性
ref类似往userDao这里属性里面传入id="**“的对象,(id=” "可以类比于一个对象)。
注意!带属性的Impl类必须带有属性的set方法,如上所示,不然这个ref是起不了作用的
<bean id="userServiceImpl" class="com.earth.service.UserServiceImpl">
<property name="userDao" ref="oracle"/>
</bean>
最后再解释下bean中的id、class属性
id:类比成new出来的对象名
class:要new的类名
<bean id="user" class="com.earth.dao.UserDaoImpl"/>
<bean id="mysql" class="com.earth.dao.UserDaoMysqlImpl"/>
<bean id="oracle" class="com.earth.dao.UserDaoOracleImpl"/>
<bean id="sqlServer" class="com.earth.dao.UserDaoSqlServerImpl"/>
<bean id="userServiceImpl" class="com.earth.service.UserServiceImpl">
<property name="userDao" ref="oracle"/>
</bean>
控制翻转IoC(inversion of control)的对象如何创建
- 无参构造
- 有参构造
无参构造的类在通过context创建时,会调用类中的无参构造,在beans.xml中是这么赋值:
<bean id="user" class="com.earth.pojo.User">
<property name="id" value="1"/>
<property name="name" value="earth地球"/>
</bean>
有参构造的类需要通过<constructor-arg>标签来赋值
这个标签还有
- index
- type
- name
等属性,不写的默认按下标1、2、3。。。。方式递增,赋值方式如下:
<bean id="house" class="com.earth.pojo.House">
<constructor-arg value="i am a house"/>
<constructor-arg value="1111"/>
<constructor-arg ref="user1"/>
<constructor-arg ref="user2"/>
</bean>
依赖注入DI(depedency injection)
基础类型直接用value赋值,引用类型要用ref赋值
这些都是通过setter方法注入
<bean id="user" class="com.earth.pojo.User">
<constructor-arg value="galaxy"/>
<constructor-arg value="123"/>
</bean>
<bean id="house" class="com.earth.pojo.House">
<constructor-arg value="galaxy"/>
<constructor-arg value="1000000"/>
<constructor-arg ref="user"/>
<constructor-arg ref="user"/>
</bean>
<bean id="student" class="com.earth.pojo.Student">
<property name="name" value="earth地球"/>
<property name="books">
<array>
<value>java</value>
<value>c语言</value>
<value>Python</value>
</array>
</property>
<property name="card">
<map>
<entry key="身份证" value="1234567"/>
<entry key="银行卡" value="7654321"/>
</map>
</property>
<property name="games">
<set>
<value>civilization</value>
<value>hearthstone</value>
<value></value>
</set>
</property>
<property name="hobby">
<list>
<value>奶油</value>
<value>面包</value>
<value>好好吃</value>
</list>
</property>
<property name="house" ref="house"/>
<property name="wife">
<null></null>
</property>
<property name="info">
<props>
<prop key="学号">123456</prop>
<prop key="姓名">earth地球</prop>
</props>
</property>
</bean>
spring配置
- 别名
- 导入
- name
bean的作用域
Scope | Description |
---|---|
singleton | (默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。 |
prototype | 将单个 bean 定义的作用域限定为任意数量的对象实例。 |
request | 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring ApplicationContext中有效。 |
session | 将单个 bean 定义的范围限定为 HTTP Session的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。 |
application | 将单个 bean 定义的范围限定为ServletContext的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。 |
websocket | 将单个 bean 定义的范围限定为WebSocket的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。 |
自动装配
通过@AutoWired注解
使用注解开发
首先要引入带有注解的.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:annotation-config/>
</beans>
然后类的属性定义时候使用注解,此时就无需在xml文件中编写注解。只需在pojo类中使用注解,如下所示:
public class Person {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
public void getPets(){
cat.bark();
dog.bark();
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setDog(Dog dog) {
this.dog = dog;
}
}