Spring(二)
目录
Spring(二)
HelloSpring
- 实体类
@Data
public class Hello {
public String str;
}
- 配置文件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">
<!--使用Spring来创建对象,在Spring中这些都称为Bean-->
<bean id="hello" class="com.yhr.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
- 测试
@Test
public void test(){
//获取Spring的容器,通过容器获取对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello hello = context.getBean("hello", Hello.class);
System.out.println(hello);
}
IoC创建对象的方式
- 默认使用无参构造创建对象
<property name="name" value="yhr"/>
- 在获取ApplicationContext时就已经创建了对象,并且进行初始化
- getBean方法得到的永远是同一个对象(单例模式)
- 使用有参构造:
- 下标赋值:
<constructor-arg index="0" value="yhr"/> - 类型赋值:
<constructor-arg type="java.lang.String" value="yhr"/> - 参数名赋值:
<constructor-arg name="name" value="yhr"/>
- 下标赋值:
Spring配置
别名
<alias name="user" alias="abc"/>
- 可以使用别名获取对象
bean的配置
- id:bean的唯一标识符,也就是对象名
- class:对应类型的全限定名
- name:别名
- 可以同时取多个别名,在字符串内用逗号、分号、空格等区分
import
- 将多个配置文件导入合并为一个
依赖注入DI
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性由容器注入
构造器注入
- constructor-arg标签
- 必须要有有参构造器
Setter方式注入
- 必须要有无参构造和setter方法
- 实体类Student和Address
@Data
public class Address {
private String address;
}
@Data
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String, String> cards;
private Set<String> games;
private String wife;
private Properties info;
}
- 注入方式:
<bean id="address" class="com.yhr.pojo.Address">
<property name="address" value="成华大道"/>
</bean>
<bean id="student" class="com.yhr.pojo.Student">
<!--普通注入,value-->
<property name="name" value="yhr"/>
<!--bean注入,ref-->
<property name="address" ref="address"/>
<!--数组注入-->
<property name="books">
<array>
<value>西游记</value>
<value>三国演义</value>
<value>水浒传</value>
<value>红楼梦</value>
</array>
</property>
<!--List注入-->
<property name="hobbies">
<list>
<value>听歌</value>
<value>敲代码</value>
<value>看电影</value>
</list>
</property>
<!--Map注入-->
<property name="cards">
<map>
<entry key="身份证" value="123456"/>
<entry key="银行卡" value="234567"/>
</map>
</property>
<!--Set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>DOTA2</value>
</set>
</property>
<!--null值注入-->
<property name="wife">
<null/>
</property>
<!--Properties注入-->
<property name="info">
<props>
<prop key="学号">202022010314</prop>
<prop key="性别">男</prop>
</props>
</property>
</bean>
拓展方式注入
p命名空间
- beans标签加入属性
xmlns:p="http://www.springframework.org/schema/p"
<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="user" class="com.yhr.pojo.User" p:name="yhr" p:age="18"/>
- 必须有无参构造和set方法
c命名空间
- 导入c命名空间
xmlns:c="http://www.springframework.org/schema/c"
<!--c命名空间注入,可以直接通过构造器注入:constructor-arg-->
<bean id="user2" class="com.yhr.pojo.User" c:name="yhr" c:age="18"/>
- 必须有有参构造
Bean的作用域
- bean标签的scope属性,可以有如下设置
- singleton(默认):单例模式,全局唯一
- prototype:原型模式,每次从容器中get时,都会产生一个新的对象
- request、session、application、websocket在Web开发中使用
Bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并给bean装配属性
- 三种装配方式:
- 在xml中显式配置
- 在java中显式配置
- 隐式的自动装配(autowire)
ByName自动装配
- 会自动在容器上下文中查找,和自己对象setter方法后面的值对应的beanid
<bean id="cat" class="com.yhr.pojo.Cat"/>
<bean id="dog" class="com.yhr.pojo.Dog"/>
<bean id="people" class="com.yhr.pojo.People" autowire="byName">
<property name="name" value="yhr"/>
</bean>
ByType自动装配
-
会自动在容器上下文中查找,和自己对象属性类型相同的bean
-
可以没有id,但必须保证类型唯一
<bean id="cat" class="com.yhr.pojo.Cat"/>
<bean id="dog111" class="com.yhr.pojo.Dog"/>
<bean id="people" class="com.yhr.pojo.People" autowire="byType">
<property name="name" value="yhr"/>
</bean>
使用注解实现自动装配
-
jdk1.5支持注解,Spring2.5支持注解
-
导入context约束
-
配置注解的支持
<context:annotation-config/>
<?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>
-
@Autowired注解修饰属性,需要有参构造@Autoowired(required=false)表示属性可以为空@Nullable修饰构造函数中的参数,参数可以为空
-
@Qualifier(value = "")显式指定bean的id -
@Resourcejava自带的注解,也可以实现自动装配- 可以通过name属性指定id
使用注解开发
- 在Spring4之后,要使用注解开发,必须导入aop的包
- 需要导入context约束
- 扫描指定的包
<!--扫描指定的包-->
<context:component-scan base-package=""/>
bean
@Component修饰类,等价于注册了一个bean,id为类名小写
属性注入
@Value("yhr")修饰属性,相当于property标签- 引用类型使用
@Autowired
衍生注解
@Component有几个功能相同的衍生注解,在web开发中,按照MVC三层架构分层:- dao:
@Repository - service:
@Service - controller:
@Controller
- dao:
作用域
@Scope(""):value中填写作用域
小结
- xml更加万能,适用于任何场合,维护简单方便
- 注解维护相对复杂
- 最佳实践:
- xml用来管理bean
- 注解只负责完成属性的注入
使用Java的方式配置Spring
- 在Spring4后,JavaConfig成为了一个核心功能
@Configuration
public class AppConfig {
@Bean
public User getUser(){
return new User();
}
}
-
方法名为bean的id,返回值为bean的类
-
也可以使用
@ComponentScan("package")进行扫描,就不需要写方法注册了 -
测试时使用
new AnnotationConfigApplicationContext(AppConfig.class)来获取上下文 -
使用
@Import(AppConfig2.class)来引用另一个配置类

浙公网安备 33010602011771号