1、IOC(控制反转)
(程序主动权由程序员转移到用户手中)是一种设计思想,是spring的核心内容,可以用xml配置,也可以用注解配置。
DI(依赖注入)是实现IOC的一种方法。
ctrl+alt+u快捷键(显示继承关系)
-
ref:引用spring容器中已经创建好的对象
-
value:具体的值,基本数据类型
问题一:context无法获取getBean方法
IOC创建对象的方式:
-
一、使用无参构造创建对象,默认!
-
二、假如要使用有参构造
<!--第一种:下标赋值--> <bean id="user" class="com.heu.pojo.User"> <constructor-arg index="0" value="李四"/> </bean> <!--第二种:通过类型创建,不建议使用--> <bean id="user" class="com.heu.pojo.User"> <constructor-arg type="java.lang.String" value="王五"/> </bean> <!--第三种:直接通过参数名设置--> <bean id="user" class="com.heu.pojo.User"> <constructor-arg name="name" value="张三"/> </bean>
在配置文件加载的时候,容器中管理的对象就被实例化了
2、Spring的配置
-
alias(别名)也可以用别名获取到这个对象
-
bean:
id:bean的唯一标识符
class:bean对象所对应的全限定名:包名+类名
name:也就是别名,而且name可以同时取多个别名 -
import:一般用于团队开发使用,他可以讲多个配置文件,导入合并为一个
3、DI依赖注入
-
(一)构造器注入
-
(二)set方式注入【重点】
依赖注入:set注入依赖:bean对象的创建依赖于容器 注入:bean对象中的所有属性,由容器来注入
环境搭建:
1.复杂类型
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.真实测试对象
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
3.beans.xml
<!--第一种,普通注入,直接通过value赋值-->
<property name="name" value="张三"/>
<!--第二种,Bean注入,ref-->
<property name="address" ref="address"/>
<!--数组-->
<property name="books">
<array>
<value>水浒传</value>
<value>三国演义</value>
<value>红楼梦</value>
<value>西游记</value>
</array>
</property>
<!--list-->
<property name="hobbys">
<list>
<value>游戏</value>
<value>学习</value>
</list>
</property>
<!--map-->
<property name="card">
<map>
<entry key="身份站" value="23456"/>
<entry key="银行卡" value="669059678769"/>
</map>
</property>
<!--set-->
<property name="games">
<set>
<value>lol</value>
<value>kkk</value>
</set>
</property>
<!--null-->
<property name="wife">
<null/>
</property>
<!--properties-->
<property name="info">
<props>
<prop key="学号">12345678</prop>
<prop key="性别">男</prop>
</props>
</property>
</bean>
- (三)拓展方式注入
命名空间注入,可以直接注入属性的值,需要加上下面的约束
xmlns:p=“http://www.springframework.org/schema/p”
xmlns:c=“http://www.springframework.org/schema/c”
<!--p命名空间注入,无参构造-->
<bean id="user" class="com.heu.pojo.User" p:name="张三" p:age="22"/>
<!--c命名空间注入,有参构造-->
<bean id="user2" class="com.heu.pojo.User" c:name="李四" c:age="22"/>
4、Bean的作用域
- singleton(单例模式)spring默认机制
- prototype(原型模式)每次从容器种get的时候,都会产生一个新对象
- request
- session
- application
- websocket
5、Bean的自动装配
自动装配是spring满足Bean依赖的一种方式
spring在会在上下文种自动寻找,并自动给bean装配属性
在spring中有三种装配方式
-
1、在xml中显示配置
-
2、在Java中显示配置
-
3、隐式的自动装配bean[重要]
自动装配
byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
需要保证所有bean的id唯一
byType:会自动在容器上下文中查找,和自己对象属性类型相同的beanid
需要保证所有bean的class唯一
使用注解实现自动装配
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解支持-->
<context:annotation-config/>
</beans>
要使用注解须知
-
1、导入约
xmlns:context=“http://www.springframework.org/schema/context” -
2、配置注解的支持
context:annotation-config/
@Autowired
直接在属性上使用即可
使用Autowired可以不用编写set方法,前提是这个自动装配的属性在ioc(spring)容器中存在且符合名字。
小结:
@ Resourcee和@ Autowired的区别:
- 都是用来自动装配的,都可以放在属性字段上
- @ Autowired通过byname的方式实现,如果找不到名字,则通过byType实现,如果都找不到,就报错
- @ Resourcee通过byType的方式实现,如果找不到名字,则通过byname实现,如果都找不到,就报错
- 执行顺序不同:@ Autowired通过byType的方式实现;@ Resourcee默认通过byname的方式实现
6、注解说明
- @Autowired : 自动装配通过类型、名字,如果Autowired 不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”);
- @Nullable : 字段标记了这个注解,说明这个字段可以为null;
- @Resource : 自动装配通过名字、类型
- @Component :组件,放在类上,说明这个类被spring管理了,就是bean
7、使用注解开发
要使用注解开发,必须要导入aop包
使用注解要导入context约束,增加注解的支持
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--指定要扫描的包,这个包下的注解会生效-->
<context:component-scan base-package="com.heu.pojo"/>
<context:annotation-config/>
</beans>
-
1.bean
-
2.属性如何注入
//等价于<bean id="user" class="com.heu.pojo.User"/>
//@Component 组件
@Component
public class User {
public String name;
//相当于<property name="name" value="张三"/>
@Value("张三")
public void setName(String name) {
this.name = name;
}
}
-
3.衍生的注解
@Component有几个衍生注解,在web开发中,会按照mvc三层架构分层
- dao:[@Repository]
- service:【@Service】
- controller:【@Controller】这四个注解功能都是一样的,都是代表将某个类注册到spring中,装配bean
-
4.自动装配置
- @Autowired : 自动装配通过类型、名字,如果Autowired 不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”);
- @Nullable : 字段标记了这个注解,说明这个字段可以为null;
- @Resource : 自动装配通过名字、类型
-
5.作用域
-@Scope(“singleton”) -
6.小结
xml与注解:
-------xml更加万能,适用于任何场合,维护简单方便
-------注解不是自己的类使用不了,维护相对复杂
xml与注解最佳实践:
-------xml用来管理bean
-------注解只负责完成属性的注入
-------在使用时,要让注解生效,就要开启注解支持
<!--指定要扫描的包,这个包下的注解会生效-->
<context:component-scan base-package="com.heu"/>
<context:annotation-config/>
8、使用Java的方式配置spring
完全不使用spring的xml配置,全权交给Java做
实体类
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("张三")
public void setName(String name) {
this.name = name;
}
}
配置类
//@Configuration本身也是一个@Component,所以也会被注册到spring容器中,
// @Configuration代表这是一个配置类,就和beans.xml一样
@Configuration
public class MyConfig {
//注册一个bean,就相当于之前写的一个bean标签,
// 这个方法的名字,就相当于bean标签中的id属性,
// 这个方法的返回值,就相当于bean标签中的class属性
@Bean
public User user(){
return new User();
}
}
测试类
public class MyTest {
@Test
public void test01(){
//如果完全使用配置类方式做,就只能通过AnnotationConfigApplicationContex()来获取容器,通过配置类的class对象加载
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User user = context.getBean("user", User.class);
System.out.println(user.getName());
}
}
9、代理模式
springAOP的底层就是代理模式 【SpringAOP 和 SpringMVC】