项目目录
1.对于Spring的理解
Spring框架是java应用最广的框架,它的成功来源于理念,它的理念包括ioc和aop(理念:每个bean与bean之间的关系统一交给SpringIOC容器管理)。
Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
2.Spring与传统对象管理的区别
在传统中,我们使用对象都是通过new xxx()来进行对象的实例化,而在Spring框架中,一般通过扫包、注解的形式来创建对象,在创建对象的过程中,大部分使用反射机制来进行。
3.Spring注入bean的两种方式
我们先写出一个对象(UserEntity.java)
package com.entity;
public class UserEntity {
private String name;
private String age;
public void setName(String name) {
this.name = name;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "com.entity.UserEntity{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
并且在pom.xml中引入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.20.RELEASE</version>
</dependency>
</dependencies>
- xml注入
直接创建application.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">
<!-- 注入对象,一般使用小驼峰命名法 使用property注入对象属性值-->
<bean id="userEntity" class="com.spring.entity.UserEntity">
<property name="name" value="小王"/>
<property name="age" value="18"/>
</bean>
</beans>
在com.spring包下创建Application.java
public class Application {
public static void main(String[] args) {
// 解析xml配置,并指定xml文件,xml文件默认在resource根目录下
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application.xml");
// 获取对象
UserEntity userEntity = classPathXmlApplicationContext.getBean("userEntity", UserEntity.class);
System.out.println(userEntity.toString());
}
}
运行结果:
这样我们就可以发现xml中注入的数据也打印了
- 注解形式注入
在com.spring.config下创建MyConfig.java
package com.spring.config;
import com.spring.entity.UserEntity;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
//@Configuration 相当于创建了spring.xml
@Bean
public UserEntity userEntity(){
return new UserEntity();
}
}
运行结果:
这样我们也可以看到我们成功创建了UserEntity对象
当然,@Configuration注解还有着很多的用处,比如:在此注解下使用@ComponentScan(“com.spring”)就可以扫描外部包,那么我们可以在Application.java中加入这么一段代码
// 获取在MyConfig中注入的所有bean
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
运行结果:
这样我们就实现了两种注入方式,当然两种注入方式中注入的方法各种各样,不仅限于举例出来的这一种。
4.对象默认是单例还是多例
答案是,默认情况下是单例的。
测试方法(在Application.java中加入以下代码):
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
UserService userService2 = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println(userService1 == userService2);
返回结果:
这里让我们了解到了,对象默认为单例,那么我们要对象变成多例要怎么实现呢?
很简单。在需要设置为多例的对象上加入@Scope(“prototype”)即可
5.对象的创建时饿汉式还是懒汉式
先来解释一下,饿汉式和懒汉式。
饿汉式:在配置文件加载的过程中,所有的对象都被创建,这也是为什么我们每一次启动tomcat的时候启动很慢,可启动成功之后会很快
懒汉式:在对象被使用的时候才会被创建
测试方式原理:在每一个对象被创建的时候,会走无参构造函数
测试方式:
在UserService.java中加入无参构造函数
public UserService(){
System.out.println("UserSerivce被创建");
}
在Application.java中加入代码
System.out.println("配置文件启动成功");
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
运行结果:
这也证明了我们的对象默认情况下是饿汉式加载,那么我们想要对象进行的是懒汉式加载怎么配置?
很简单,只需要在对象上加上注解@Lazy(value = true)即可