1. Spring简介
1.1 Spring 核心设计思想
1.1.1 Spring 是什么?
1.1.1.1 什么是IoC容器?
1.1.1.2 DI 概念说明
1.1.1.3 IoC容器和普通程序开发的区别
1.2 Spring 创建和使用
1.2.1 创建 Spring 项目
- 创建⼀个 Maven 项⽬
然后跳转到了这个页面:
- 添加 Spring 框架⽀持
在项⽬的 pom.xml 中添加 Spring 框架的⽀持spring-context(spring 上下⽂)和spring-beans(管理对 象的模块),xml 配置如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
- 添加启动类
最后在创建好的项⽬ java ⽂件夹下创建⼀个启动类,包含 main ⽅法即可:
public class App {
public static void main(String[] args) {
}
}
到此为止,一个spring项目就搭建好了。
1.2.2 存储 Bean 对象
- 创建 Bean
public class User {
public String sayHi(String name) {
return name + " hello!";
}
}
- 将 Bean 注册到容器
<<1>>在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources 的根⽬录下, 如下图所示:
<<2>> spring-config.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">
</beans>
<<3>> 将 User 对象注册到 Spring 中就可以,在 标签中添加配置 ,格式如下:
<beans>
<bean id="user" class="com.bit.User"></bean>
</beans>
1.2.3 获取 Bean 对象
- 创建 Spring 上下⽂对象
<<1>>使⽤ ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con fig.xml");
<<2>>使⽤ BeanFactory
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
- 获取指定的 Bean 对象
// 1.得到 Spring 上下⽂对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con fig.xml");
// 2.加载某个 bean
User user = (User) context.getBean("user");
1.2.4 使用 Bean
public class App {
public static void main(String[] args) {
// 1.得到 Spring 上下⽂对象
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加载某个 bean
User user = (User) context.getBean("user");
// 3.调⽤相应的⽅法
System.out.println(user.sayHi("Java"));
}
}
1.2.4 使用注解读取和存储对象
- 配置扫描路径
在 spring-config.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:content="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 https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>
- 添加注解存储 Bean 对象
将对象存储在 Spring 中,有两种注解类型可以实现:
- 类注解:@Controller(表示业务逻辑层)、@Service(服务层)、@Repository(持久层)、@Component、@Configuration(配置层)。
- ⽅法注解:@Bean
类注解是添加到某个类上的,⽅法注解是放到某个⽅法上的。
类注解使用示例:
⽅法注解@Bean 使用示例:
- 对象装配
<1> 属性注⼊
示例:
<2>构造⽅法注⼊
示例:
<3> Setter 注⼊
示例:
<4> @Resource注入
<5>使用同⼀类型多个 Bean 报错处理,当出现以下多个 Bean,返回同⼀对象类型时程序会报错。
@Controller
public class UserController5 {
// 注⼊
@Autowired
@Qualifier(value = "user2")
private User user;
public User getUser() {
return user;
}
}
2. Bean 详解
2.1 Bean的作用域
2.1.1 singleton
@Component
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java"); // 【重点:名称是 Java】
return user;
}
}
A ⽤户使⽤时,进⾏了修改操作:
@Controller
public class BeanScopesController {
@Autowired
private User user1;
public User getUser1() {
User user = user1;
System.out.println("Bean 原 Name:" + user.getName());
user.setName("悟空"); // 【重点:进⾏了修改操作】
return user;
}
}
B ⽤户再去使⽤公共 Bean :
@Controller
public class BeanScopesController2 {
@Autowired
private User user1;
public User getUser1() {
User user = user1;
return user;
}
}
查看 A ⽤户和 B ⽤户公共 Bean 的值:
public class BeanScopesTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
System.out.println("A 对象修改之后 Name:" + beanScopesController.getUser1().toString());
BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
System.out.println("B 对象读取到的 Name:" + beanScopesController2.getUser1().toString());
}
}
执⾏结果:
2.1.2 prototype
2.1.3 request
2.1.4 session
2.1.5 application
2.1.6 websocket
2.2 设置Bean的作用域
示例;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class Users {
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean(name = "u1")
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java"); // 【重点:名称是 Java】
return user;
}
}