Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (控制反转) 和 AOP(面向切面编程)。 理念:每个bean与bean之间的关系统一交给SpringIOC容器管理 比如:创建对象, 通过spring可以通过扫包、注解形式注入 使用spring IOC容器帮助我们创建对象 底层大量反射机制。
1、Spring Core:主要组件是BeanFactory,创建JavaBean的工厂,使用控制反转(IOC) 模式 将应用程序的配置和依赖性规范与实际的应用程序代码分开。【重点分析】 2、Spring AOP:集成了面向切面的编程功能(AOP把一个业务流程分成几部分,例如权限检查、业务处理、日志记录, 每个部分单独处理,然后把它们组装成完整的业务流程。每个部分被称为切面), 可以将声明性事物管理集成到应用程序中。 3、Spring Context:一个核心配置文件,为Spring框架提供上下文信息。 4、Spring Do:Spring操作数据库的模块。 5、Spring ORM:Spring集成了各种orm(object relationship mapping 对象关系映射)框架的模块,集成mybatis 6、Spring Web集成各种优秀的web层框架的模块(Struts、Springmvc) 7、Spring web MVC:Spring web层框架
思考一个问题 为什么启动SpringBoot项目的时候需要加上Configuration、@ComponentScan
答案:Configuration的作用:方便在当前springboot启动类下注入第三方jar包,@ComponentScan作用在于扫描自己里面的需要注入的bean。
Maven依赖信息
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
</dependencies>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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">
<bean id="userEntity" class="com.mayikt.v1.entity.UserEntity">
<property name="userId" value="10"/>
<property name="userName" value="mayikt"/>
</bean>
</beans>
// 1.读取spring配置文件,创建IOC容器
ClassPathXmlApplicationContext classPath = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.从SpringIoc容器获取userEntity
UserEntity userEntity = (UserEntity) classPath.getBean("userEntity");
System.out.println(userEntity.toString());
面试题分析:spring中在同一个配置文件中注入的beanid如果重复了会怎样?
答案:启动的时候会报错。 (bean已存在)
@Configuration
public class MySpringConfig {
//@Configuration 等同于配置的spring配置文件
@Bean
public UserEntity userEntity() {
return new UserEntity(10, "mayikt");
}
}
private static AnnotationConfigApplicationContext applicationContext;
public static void main(String[] args) {
//注解方式
applicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
UserEntity userEntity = applicationContext.getBean("userEntity", UserEntity.class);
System.out.println(userEntity.toString());
}
扫包下注入springIOC容器中
@Configuration
@ComponentScan("com.mayikt.v2")
public class MySpringConfig {
//@Configuration 等同于配置的spring配置文件
@Bean
public UserEntity userEntity() {
return new UserEntity(10, "mayikt");
}
}
private static AnnotationConfigApplicationContext annotationConfigApplicationContext;
public static void main(String[] args) {
annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MySpringConfig.class);
UserService userService = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println("userService:" + userService);
System.out.println("以下为IOC容器注入成功的对象");
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println(beanDefinitionNames[i]);
}
}
FilterType 有四种类型 ANNOTATION:注解类型 ASSIGNABLE_TYPE:ANNOTATION:指定的类型 ASPECTJ:按照Aspectj的表达式,基本上不会用到 REGEX:按照正则表达式 CUSTOM:自定义规则
@Configuration
@ComponentScan(value = "com.mayikt.v2", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}, useDefaultFilters = false)
public class MySpringConfig {
//@Configuration 等同于配置的spring配置文件
@Bean
public UserEntity userEntity() {
return new UserEntity(10, "mayikt");
}
}
@Configuration
@ComponentScan(value = "com.mayikt.v2", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}, useDefaultFilters = true)
public class MySpringConfig {
//@Configuration 等同于配置的spring配置文件
@Bean
public UserEntity userEntity() {
return new UserEntity(10, "mayikt");
}
}
默认情况Spring容器是单例的
UserService userService1 = annotationConfigApplicationContext.getBean("userService", UserService.class);
UserService userService2 = annotationConfigApplicationContext.getBean("userService", UserService.class);
System.out.println(userService1==userService2);
结果为true
答案:默认情况下是非懒加载的。
@Service
@Lazy(true)
public class UserService {
public UserService() {
System.out.println("UserService无参数构造被加载...");
}
}