一、Spring两大核心内容
1、控制反转IOC/DI: 应用本身不负责对象的创建和维护,对象和依赖对象的创建完全交给容器管理。
2、AOP(面向切面编程):通过预编译的方式,在运行期通过动态代理的方式来实现的一种技术
(1)在项目中使用AOP管理事务,事务的开启,提交,回滚
(2)在项目中管理事务的传播特性。
二、Spring的环境搭建
1、导包:
2、创建Spring的配置文件 ApplicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://www.springframework.org/schema/beans" 4 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 7 8 9 "> 10 11 </beans>
3、创建bean
<bean id="person" class="com.tx.model.Person" >
4、创建Spring容器
1 @Test 2 public void test1(){ 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 4 Person p = (Person) ctx.getBean("person"); 5 System.out.println(p); 6 }
三、Bean的创建方式
1、使用构造器创建(常用)
使用构造器创建bean,bean必须有默认的构造器
2、使用静态工厂方式
提供静态工厂:
1 public class FactoryBean { 2 /** 3 * 必须是静态方法 4 * @return 5 */ 6 public static User createUser(){ 7 return new User(); 8 } 9 }
进行配置:
1 <!-- id:唯一标识 2 class:静态工厂的类 3 factory-method:静态工厂的方法 4 --> 5 <bean id="user" class="com.rl.spring.factory.FactoryBean" factory-method="createUser"></bean>
3、实例工厂方式
实例工厂:
public class FactoryBean1 { public User createUser(){ return new User(); } }
配置:
1 <!-- 通过Spring来定义实例工厂 --> 2 <bean id="factoryBean" class="com.rl.spring.factory.FactoryBean1"></bean> 3 <!-- 指定要创建的bean 4 factory-bean:指定实例工厂类, 5 factory-method:工厂的创建bean的方法 6 --> 7 <bean id="user" factory-bean="factoryBean" factory-method="createUser"></bean>
4、延迟加载
在默认情况下,所有的bean都不是延迟加载的,在spring容器创建的时候把bean创建出来,所有getBean可以直接取出。。 可通过lazy-init来控制,默认是false, 如果设置为true,则在getBean时,才创建bean
5、bean的作用域
scope:singleton单例的: 可以设置延迟加载 和 非延迟加载
scope:prototype多例的:只能延迟加载
6、bean的生命周期
与容器一致,容器销毁即销毁
7、依赖注入:
(1)、常量注入
1 <bean id="person" class="com.tx.model.Person" > 2 <!-- 常量注入 --> 3 <property name="id" value="1"></property> 4 <property name="name" value="张三"></property> 5 </bean>
(2)、构造器注入
1 <bean id="user" class="com.rl.spring.model.User"> 2 <!-- 3 index:构造方法的参数的索引顺序 4 type:构造方法的参数的类型(不是必须 的) 5 value:值 6 --> 7 <!-- <constructor-arg index="0" type="java.lang.Integer" value="2"/> 8 <constructor-arg index="1" type="java.lang.String" value="张三"/> 9 <constructor-arg index="2" type="java.lang.String" value="666"/> --> 10 <constructor-arg index="0" value="2"/> 11 <constructor-arg index="1" value="张三"/> 12 <constructor-arg index="2" value="666"/> 13 </bean>
(3)、外部bean注入,必须提供set方法
1 <bean id="userDao" class="com.tx.spring.dao.impl.UserDaoImpl"> 2 <property name="dataSource" ref="dataSource"></property> 3 </bean> 4 <bean id="userService" class="com.tx.spring.service.impl.UserServiceImpl"> 5 <property name="userDao" ref="userDao"></property>
6 </bean>
(4)、内部bean注入,必须提供set方法
(5)、集合注入,必须提供set方法
1 <bean id="ci" class="com.rl.spring.model.CollectionInjection"> 2 <property name="set"> 3 <set> 4 <value>football</value> 5 <value>basketball</value> 6 </set> 7 </property> 8 <property name="list"> 9 <list> 10 <value>male</value> 11 <value>female</value> 12 </list> 13 </property> 14 <property name="map"> 15 <map> 16 <entry key="key1" value="value1"></entry> 17 <entry key="key2" value="value2"></entry> 18 </map> 19 </property> 20 <property name="prop"> 21 <props> 22 <prop key="name">张三</prop> 23 <prop key="job">程序员</prop> 24 </props> 25 </property> 26 </bean>
8、注解方式注入
(1)、引包:annocation包,如果4.2还需要引入aop包
(2)、引入约束文件spring-context-4.2.xsd
(3)、开启注解驱动
<!-- 开启注解的驱动 --> <context:annotation-config/>
@Resource注解: 放在属性上,也可以放在set方法上。 不需要提供set方法。 默认先根据名称找,如果没有按照接口与实现类的关系找,如果有多个实现类需要指定name
@Autowired注解:放在属性上,也可放在set方法上,根据接口与实现类的关系找,如果多个实现类需要配合 @Qulifier的注解指定value
9、Spring扫描器注解
@Controller:控制层的类
@Service:服务层的类
@Repository:数据层的类
@Component:无法分层的类上