spring基础
spring是一个开放源代码的设计层框架,解决的是业务逻辑层和其他层松耦合的问题,它将面向接口的编程思想贯穿整个应用.简单来说,spring是一个分层的javase/ee 一站式的轻量级开源框架
特点
方便解耦
通过spring提供的ioc容器,我们开源将对象之间的依赖关系由spring进行控制,避免硬编码所造成的国度程序耦合,有了spring用户不必再为单例模式类,属性文件解析等这些底层的需求编写代码,开源专注于更加上层的应用.
Aop编程的支持
通过spring提供的Aop(面向切面)编程,方便进行面向切面的编程.许多不容易用传统oop(面向对象)实现的功能开源通过Aop轻松应付
声明事物的支持
在spring中,我们可以从单调烦闷的事物管理代码中解脱出来,通过声明方式灵活地进行事物的管理,提高开发效率和质量
方便测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在spring里,测试不再是昂贵的操作,而是随手可做的事情,例如spring对junit4支持,可以通过注解方便的测试spring程序
方便集成各种优秀框架
spring不排除各种优秀的开源框架,相反,spring可以降低各种框架的使用难度,提供了对于各种优秀框架的直接支持
将低javaee api使用难度
spring对很多难用的javaeeapi如jdbc,javamail,远程调用等,提供了一个轻薄的封装,通过spring的简易封装,这些javaeeapi的使用难度大幅度降低
IOC与DI
IOC
IOC Inversion of Control控制反转,将对象的创建权交给spring
传统开发模式
业务和实现类过于紧密,底层业务要修改源代码
无参实例化
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"
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
http://www.springframework.org/schema/mvc
">
<bean id="userDao" class="com.itlike.demo1.User"></bean>
</beans>
测试
package com.itlike.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//
User user=(User)applicationContext.getBean("userDao");
user.destory();
}
}
创建的时机
老版本Beanfactory当调用getBean时候才会加载
新版本ApplicationContext,当加载配置文件的时候就会创建实例对象
实现类的俩种加载方法
可以指定初始化和类销毁的时候执行的方法
init-method:初始化调用的方法,初始化调用对全局有效
destory-method:销毁的时候调用的方法
- 可以用applicationContext.close()来销毁工厂,如果是多例的,对象不会销毁
scope="" 参数:
- singleton:默认的,单例模式,获取的每个对象
- prototype:每一次都创建一个新的对象
- request 应用在web项目中,spring创建这个类之后,将类存入到request中
- session应用在web项目中,spring创建这个类之后,将类存入到session中
- globalsession应用在web项目中,必须在porlet(基于java的web组件,子域名)环境下使用.如果没有这种环境,就相对于session
<bean id="userInt" class="com.itlike.demo1.User" init-method="init" destory-method="destory">
</bean>
静态工厂实例化
factory-method="指定静态的返回对象的方法区创建对象"
factory-bean="user"指定另一个类
User类
package com.itlike.demo1;
public class User{
public static User createUser(){
//必须是静态方法,必须返回一个值,作为实例化对象
System.out.println("创建User");
return new User();
}
//
public void init(){
System.out.println("user创建");
}
public void destory(){
System.out.println("user销毁");
}
}
xml
<bean id="userDao" class="cn.nasuiyile.test.User" init-method="init" destory-method="destory">
<project name="name" value="123123"/>
</bean>
实例工厂实例化(调用上面的实例化)
<bean id="userInt" class="com.itlike.demo1.User" init-method="init" factory-method="createUser">
</bean>
<bean id="userDao" class="com.itlike.demo1.User" factory-bean="userInt"></bean>
分模块
引入其他模块
一次性引入多个配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml","app2.xml");
最佳
<import resource="classpath:application-mybatis.xml"/>
属性注入
DI
依赖注入,前提必须有ioc的环境,依赖注入:给spring管理类当中各依赖的管理属性,通过配置文件进行复制的过程
<!--为自己起的名,可以加载文件之后getBean传入id来获取类实例-->
<bean id="userDao" class="cn.nasuiyile.test.UserDaoMysql">
<!--name:要注入的属性名称,value:注入值,属性:要提供set方法-->
<project name="name" value="123123"/>
</bean>
构造犯法注入
<bean id="gz" class="com.itlike.demo1.User">
<constructor-arg name="id" value="1"/>
</bean>
注入引用数据类型
,也需要提供get与set方法
user类
package com.itlike.demo1;
public class User{
Dog dog;
public void setDog(Dog dog) {
this.dog = dog;
}
public Dog getDog() {
return dog;
}
}
dog类
package com.itlike.demo1;
public class Dog {
String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
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"
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
http://www.springframework.org/schema/mvc
">
<!--<bean id="userInt" class="com.itlike.demo1.User" init-method="init" factory-method="createUser">-->
<!--</bean>-->
<!--<bean id="userDao" class="com.itlike.demo1.User" factory-bean="userInt"></bean>-->
<bean id="dog" class="com.itlike.demo1.Dog">
<property name="name" value="旺财"/>
</bean>
<bean id="gz" class="com.itlike.demo1.User">
<property name="dog" ref="dog" />
</bean>
</beans>
main
package com.itlike.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)applicationContext.getBean("gz");
System.out.println(user.dog.name);//旺财
}
}
p名称空间
在xml上面加上
xmlns:p="http://www.springframework.org/schema/p"
,可以用p:属性值代替<property>,用法为p:属性名="value值"
一般不推荐使用
<bean id="dog" class="com.itlike.demo1.Dog" p:name="旺财">
</bean>
这俩个作用相同
<bean id="dog" class="com.itlike.demo1.Dog" >
<property name="name" value="旺财"/>
</bean>
spring中还可以写el表达式
集合类型注入
dog类
package com.itlike.demo1;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Dog {
public String attr[];
public List mylist;
public Set mySet;
public Map myMap;
public Map getMyMap() {
return myMap;
}
public void setMyMap(Map myMap) {
this.myMap = myMap;
}
public String[] getAttr() {
return attr;
}
public void setAttr(String[] attr) {
this.attr = attr;
}
public List getMylist() {
return mylist;
}
public void setMylist(List mylist) {
this.mylist = mylist;
}
public Set getMySet() {
return mySet;
}
public void setMySet(Set mySet) {
this.mySet = mySet;
}
}
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"
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
http://www.springframework.org/schema/mvc
">
<bean id="dog" class="com.itlike.demo1.Dog">
<property name="attr">
<list>
<value>123</value>
<value>123</value>
<value>123</value>
</list>
</property>
<property name="mylist">
<list>
<value>123</value>
<value>123</value>
<value>123</value>
</list>
</property>
<property name="mySet">
<set>
<value>123</value>
<value>222</value>
<value>212</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="key1" value="23"></entry>
<entry key="key2" value="2123"></entry>
<entry key="key3" value="23"></entry>
</map>
</property>
</bean>
</beans>
main
package com.itlike.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Dog dog=(Dog)applicationContext.getBean("dog");
System.out.println(dog.attr[0]);
System.out.println(dog.mylist);
System.out.println(dog.mySet);
System.out.println(dog.myMap);
}
}
spring注解开发
在spring4之后想要使用注解形式需要引入aop的包,在配置文件当中还要引入一个context约束
@component("名")相当于在配置文件中配置<bean id="" class="">
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"
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
http://www.springframework.org/schema/mvc
">
<!--指定扫描的包-->
<context:component-scan base-package="com.itlike"/>
</beans>
user类
package com.itlike.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("user")
public class User{
//如果提供set方法在set方法上面@value("值")
//如果不提供set方法,就直接@value
@Value("默认值")
public String name;
}
main
package com.itlike.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)applicationContext.getBean("user");
System.out.println(user.name);
}
}
三个衍生注解
为了更好的分层,spring可以使用跟其它三个注解,功能类似目前使用哪一个功能都一样.后面可能会添加一些自己的属性
@controller web层
@Service service层
@Repository dao层
属性注入
@Value 设置普通属性值
@Autowired 设置对象类型的属性值,直接使用这种方式,是按照类型完全属性注入,不需要再主街上使用id名称,习惯是按照名称完成属性注入.根据类名,自动找到spring管理的对应的类,进行注入.
@Qualifier("dog") 根据名称进行注入
@Resource(name="dog")//这样写等于以上俩种写法
@PostConstruct 初始化方法
@PerDestory 销毁方法
@Scope作用范围 类似xml配置中的scope属性
dog类
package com.itlike.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("dog")
public class Dog {
@Value("旺财")
public String name;
public Dog dog;
}
user类
package com.itlike.demo1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("user")
public class User{
@Autowired//根据类型进行注入
@Qualifier("dog")//根据名称注入
Dog dog;
@Value("默认值")
public String name;
}
main
package com.itlike.demo1;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)applicationContext.getBean("user");
System.out.println(user.dog.name);
}
}
xml与注解整合开发
xml与注解比较:xml可以使用于任何常见,结构清晰,维护方便,注解不是自己提供的类使用不了,开发方便
<Context:anntation-config/>
使用该注解就可以直接在类中
xml管理bean,注解完成属性注入
使用过程中,可以不用扫描,扫描是为了防止类上的注解在没有扫描的情况下,使用@Resource @value @Autowired @Qulifer