2020-03-15spring框架2
spring框架的相关内容(续)
Bean的作用范围的配置
scope :Bean的作用范围
singleton :默认的,spring会采用单例模式创建这个对象
prototype :多例模式
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中
globalsession:应用在web项目中,必须在porlet环境下使用,但是如果没有这种环境,相当于session
单例模式下:一个类不管在测试类中实例化几次,地址都是一样的,都是一个类
多例模式下:一个类实例化几次就会创建几个对象,地址不同,如果在类中直接new则默认多例
bean的生命周期
1.执行bean构造器;
2.为bean注入属性;
3.调用<bean init-method="init"/>初始化;
4.执行程序业务逻辑;
5.调用<bean destroy-method="destory"/>进行销毁
PS:以上流程只在单例模式执行,多例模式只负责创建,其他一概不管
使用静态方法创建对象
新建xml文件
clipboard.png
<!-- 使用静态方法创建对象 -->
<bean class="com.testSpring.Car" id="car1" factory-method="staticInstance"></bean>
使用实例工厂创建对象
需要新建一个类作为实例工厂
public class InstanceFactory {
public Car Instance() {
System.out.println("实例工厂");
return new Car();
}
}
xml文件中:
<!-- 使用实例方法创建 -->
<bean class="com.testSpring.InstanceFactory" id="instanceFactory"></bean>
<bean class="com.zut.testSpring.Car" id="car3" factory-bean="instanceFactory" factory-method="Instance"></bean>
Spring属性注入的方式
构造方法方式
实体类:
private String s;
public AddUsersController(String s) {
this.s=s;
}
public String toString() {
return ("["+s+"]");
}
xml文件:
<bean class="com.testSpring.AddUsersController" id="userController" >
<constructor-arg name="s" value="dfh"></constructor-arg>
//这一句也可以写成:<constructor-arg index="0" value="dfh"></constructor-arg>
</bean>
测试类:
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
AddUsersController userController=context.getBean(AddUsersController.class);
System.out.println(userController);
须有有参构造
简写(c标签)
//加上引用
xmlns:c="http://www.springframework.org/schema/c"
<!-- 利用c标签简写 -->
<bean class="" id="" c:name="" c:age=""></bean>
set方法的注入
<bean class="com.testSpring.Car" id="car" >
<property name="name" value="zhangsan"></property>
<property name="price" value="10000"></property>
</bean>
<!-- value是设置普通类型的值,ref是用来设置其他的类的id或name -->
<property name="car" ref="car"></property>
//ref里的car是来源于上一个bean里的实例的id
constructor-arg:通过构造函数注入。 所以一定要有构造函数
property:通过setter对应的方法注入。所以一定要有set函数
P标签注入(set简写)
写法:
普通属性 p:属性名="值"
对象属性 p:属性名-ref="值"
<bean class="com.testSpring.Car" id="car" p:name="zhangsan" p:price="30000"></bean>
<bean class="com.testSpring.Employee" id="employee" p:name="zhangsan" p:car-ref="car"></bean>
SPEL的属性注入
<!--SPEL的属性注入 -->
<bean class="com.testSpring.Car" id="car" >
<property name="name" value="#{'abc'}"></property>
</bean>
<bean class="com.testSpring.AddUsersController" id="userController">
<property name="s" value="#{car.name}"></property>
</bean>
**实体类中需要set数组
如果类的属性为spring[]数组
<bean class="com.testSpring.Car" id="car" >
<property name="str" >
<list>
<value>av</value>
<value>bc</value>
</list>
</property>
</bean>
//如果装的是普通类型的话为value,如果为对象类型的话为ref
//list同上,数组情况下list标签也可以改为array
注入Set<String>和Map<String,String>
<property name="set" >
<set>
<value>av</value>
<value>bc</value>
</set>
</property>
//如果为对象类型则将value改为ref
<property name="map" >
<map>
<entry key="a" value="b"></entry>
</map>
</property>
//如果key和value为对象类型的,则改为key-ref和value-ref
注解形式实现IOC
首先要在xml文件中勾选spring-context相关内容
clipboard.png
xml中会自动添加以下语句
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">
然后写入应用上下文扫描
<!-- 应用上下文扫描 -->
<context:component-scan base-package="com.zut.testSpring"></context:component-scan>
该语句会自动扫描pakage中所有带@Component的类
@Component注解
组件
通过注解进行bean实例化。
注解后可以不加括号,默认名称为首字母小写
有三个衍生注解:
@Controller -> web层
@Service -> service层
@Repository -> dao层
注解后加括号可以指定名称
@Component("c")
@Value注解
普通属性,通过注解进行属性注入,可以不要set方法
@Value("aaabc")
private String name;
@Autowired注解
对象类型,自动按类型注入注入,相当于ref
自动寻找复合要求的类进行注入,但是类前要有@Component注解
如果想要按名称注入,需与@Qualifier联用,但次名称需与被注入的类上的@Component所指定的名称相同。
当有多个符合要求的类时,会出现错误
@Autowired
@Qualifier("c")
private Car car;
@Resource注解
默认按照bean的名称进行注入,要求指定注入名称
@Resource(name="userService")
private UserService userService;
@Scope注解
指定当前bean的作用范围 单例 singlton ,多例 prototype 等,前提是一定要有上下文扫描
在类前标志
@PostConstruct和@PreDestory注解
@PostConstruct:相当于bean标签里配置的init-method,标志在类里的初始化方法前
@PostDestory:相当于bean标签里配置的destory-method,标志在类里的销毁方法前
Bean任意场景下均能使用,结构清晰,维护方便。注解开发方便,但是注解有些地方用不了,比如说这个类不是自己提供的。
整合开发:使用XML管理bean,注解完成属性注入
例如:在ProductService中调用ProductDao和OrderDao的方法,利用bean创建类
//扫描是为了扫描类上的注解,使用属性上的注解可以直接使用以下标签
<context:annotation-config/>
//在XML文件中加入bean标签创建类
<bean id="productService" class="com.ProductService"></bean>
<bean id="productDao" class="com.ProductDao"></bean>
<bean id="orderDao" class="com.OrderDao"></bean>
ProductService中内容:
@Resource(name="productDao")//name必须与id里的相同
private ProductDao productDao;
@Resource(name="orderDao")
private OrderDao orderDao;
public void save(){
productDao.save();
orderDao.save();
}
Spring+Junit测试
是spring中所提供的一个方便测试的方式,一般不用于正式开发
首先要在pom.xml中引入:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
在测试类中加入注解:
@RunWith(SpringJUnit4ClassRunner.class)
//指class文件下的所有xml文件
@ContextConfiguration(locations= {"classpath*:/*.xml"})
//或者这样写
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:Spring-config.xml")
然后测试:
@Autowired//自动注入所需类
private AddUsersController add;
@Test
public void test() {
add.addUser();
}