1、搭建Spring项目
(1).加载依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
(2).在resources中新建配置文件
文件名官方推荐------applicationContext.xml
新建方式:在resources右击->New->XML Configuration File->Spring Config然后会出现
点击Configure application context->create new application context->ok就完成了
2. Spring框架特征实例
(1). 工厂分为静态工厂和非静态工厂
创建对象的实例:
public class PeersonFactory {
//创建person的静态方法
public static Person createPerson(){
System.out.println("通过静态工厂创建了对象");
return new Person(123,"小乔","女");
}
}
public class NoStaticPeersonFactory {
//创建person的非静态方法
public Person createPerson(){
System.out.println("通过非静态工厂创建了对象");
return new Person(123,"小乔","女");
}
}
<!--name="person,person2"相当于小名,可以取多个值 但是不能重复
id:不可以重复且不能使用特殊字符
lazy-init表示对象的加载时机(true(使用对象的时候才创建);false(spring框架一启动就加载))-->
<!--方式1.无参构造方法创建对象-->
<bean id="p1" name="person1,person2" class="com.swjd.bean.Person"
scope="singleton" lazy-init="true" init-method="init" destroy-method="destroy">
<!-- DI-依赖注入(给对象赋值)-->
<property name="id" value="975"></property>
<property name="name" value="貂蝉"></property>
<property name="sex" value="女"></property>
</bean>
<!--scope="prototype":表示创建对象的规则变成多例-->
<bean id="p2" name="person3,person4" class="com.swjd.bean.Person" scope="prototype">
<!-- DI-依赖注入(给对象赋值)-->
<property name="id" value="857"></property>
<property name="name" value="虞姬"></property>
<property name="sex" value="女"></property>
</bean>
<!--方式2.用带参的构造方法创建对象-->
<bean id="p3" class="com.swjd.bean.Person">
<constructor-arg index="0" type="int" value="9528"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="蔡文姬"></constructor-arg>
<constructor-arg index="2" type="java.lang.String" value="女"></constructor-arg>
</bean>
<!--方式3.用静态工厂创建对象-->
<bean id="p4" class="com.swjd.beanfactory.PeersonFactory" factory-method="createPerson">
</bean>
<!--方式4.用非静态工厂创建对象-->
<bean id="noStaticFactory" class="com.swjd.beanfactory.NoStaticPeersonFactory" ></bean>
<bean id="p5" factory-bean="noStaticFactory" factory-method="createPerson">
</bean>
(2).IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理,简单说,就是创建UserService对象控制权被反转到了Spring框架。(对象从容器里拿出来而不是通过new出来)
(3).DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件
Spring的五种注入方式:
1. 调用set方法注入
2. 通过带参的构造方法
3. P命名空间注入(本质还是set注入,语法更简洁)
4. SPEL表达式注入
5. 复杂类型的注入:1)注入对象
2)注入数组
3)注入集合
4)注入Map实例
(4).先创建一个Dog类、Student类和Man类
以下为applicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建对象-->
<bean id="d1" class="com.swjd.bean.Dog">
<property name="id" value="1"></property>
<property name="name" value="genki"></property>
<property name="sex" value="公"></property>
</bean>
<!--第一种:set注入-->
<bean id="m1" class="com.swjd.bean.Man">
<property name="id" value="1"></property>
<property name="name" value="管田将晖"></property>
<property name="age" value="27"></property>
<!--<property name="dog" ref="d1"></property>-->
<property name="dog">
<ref bean="d1"></ref>
</property>
</bean>
<!--第二种:通过带参的构造方法-->
<bean id="m2" class="com.swjd.bean.Man">
<constructor-arg index="0" type="int" value="2"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="Jerry"></constructor-arg>
<constructor-arg index="2" type="int" value="21"></constructor-arg>
<constructor-arg index="3" type="com.swjd.bean.Dog" ref="d1"></constructor-arg>
</bean>
<!--第三种:P命名空间注入-->
bean id="m3" class="com.swjd.bean.Man" p:id="3" p:name="猪八戒" p:age="108" p:dog-ref="d1"></bean>
<!--第四种:SPEL表达式注入-->
<bean id="m4" class="com.swjd.bean.Man">
<property name="id" value="#{m1.id}"></property>
<property name="name" value="#{m3.name}"></property>
<property name="age" value="#{m1.age}"></property>
</bean>
</beans>
以下为第五种复杂类型的注入
<?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">
<bean id="s1" class="com.swjd.bean.Student">
<property name="name" value="小松菜奈"></property>
<property name="hobbies">
<array>
<value>拍照</value>
<value>演戏</value>
<value>苏打</value>
</array>
</property>
<property name="subject">
<list>
<value>Spring</value>
<value>MyBatis</value>
</list>
</property>
<property name="map">
<map>
<entry key="Chinese">
<value>95</value>
</entry>
<entry key="Math">
<value>100</value>
</entry>
</map>
</property>
</bean>
</beans>
(5).测试
public class MyTest {
public static void main(String[] args) {
//1.启动Spring容器
ClassPathXmlApplicationContext context=
new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿对象
System.out.println(context.getBean("m1", Man.class));
System.out.println(context.getBean("m2", Man.class));
System.out.println(context.getBean("m3", Man.class));
System.out.println(context.getBean("m4", Man.class));
}
}