目录
1.IOC和DI
1.1DI的两种用法
1.2IOC和DI的区别
2.bean的操作
3.spring注解开发
4.spring在web中的应用
5.junit测试
需要的基本jar包
一、IOC和DI
(1)IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。
本来由我们自己创建实例化对象,现在交给spring来管理。
测试用例:
//(1)在application.xml配置文件中配置bean
<bean id="Admins" class="dao.Admin"></bean>
//id:是调用的名称。 class:是javabean的全包路
//(2)测试:使用Juint测试
//使用org.springframework的包,进行获取application.xml文件。
ApplicationContext ap = new ClassPathXmlApplicationContext("spring/application.xml");
//使用 .getBean("") 的方法,获取到对应的javabean
Admin bean = (Admin) ap.getBean("Admins"); //交给spring进行实例化对象
(2)DI—Dependency Injection,即“依赖注入”。
由容器在运行期间,动态的将某个依赖关系注入到组件中。
依赖注入的两种用法
(1)Setter注入
- 普通注入
//name : 是javabean的属性名称。 value : 是赋值
<bean id="Admins" class="dao.Admin">
<property name="username" value="黄"></property>
</bean>
- List注入
//可以存入多个值, 也可以使用 ref 导入其他的bean
<bean id="Admins" class="dao.Admin">
<property name="ms">
<list>
<value>灿灿</value> (1)直接注入
<ref bean="password"/>(2)外链注入
</list>
</property>
</bean>
- map注入
//nap注入。有三种方式。
<property name="ms">//属性名。
<map>
<entry key="" value=""></entry> //(1)键、值
<entry key="" > //(2)键、外链值
<ref bean=""/>
</entry>
//(3)外链键、外链值
<entry key-ref="" value-ref="" ></entry>
</map>
- propertie注入
<property name="ms">
<props> //键是key 值写在里面
<prop key=""> </prop>
</props>
</property>
(2)构造注入:
//注意构造的注入,要根据构造函数的参数的多少。要输入对应的值。
//还有 type、ref等属性可以使用
<bean id="Admins" class="dao.Admin">
//(1)直接存入的值,默认从第一个参数存入
<constructor-arg name="id" value="99999"></constructor-arg>
//(2)使用index进行构造函数的参数的定位。
<constructor-arg index="1" value="huang"></constructor-arg>
</bean>
注意点:如果结构相同,那么标签就可以互换使用。
IOC和DI的区别
IOC:是指对象实例化的权利交给spring容器来管理
DI:在spring创建bean对象的过程中,动态的将对象所依赖的属性通过配置注入对象中。
二、spring中bean的操作
- Bean的实例化
(1)无参构造器
Javabean类中,如果有有参构造器。则一定要把无参构造器写上。
(2)静态工厂方法:
定义一个工厂类,工厂类中提供一个静态的static。并返回bean对象的方法。(不常用)
//id 调用名称; class 静态工厂类路径; factory-method 静态工厂的方法
<bean id="" class="" factory-method=""></bean>
(3)实例化工厂方法:
定义一个工厂类。有非static的创建并返回bean对象。需要配置工厂。还需要配置bean(不常用)
//(1)注册bean class : 实例化工厂类路径
<bean id="" class=""></bean>
//(2)调用 id 调用名; factory-bean: 上面的id; factory-method 工厂中的方法。
<bean id="" factory-bean="" factory-method=""></bean>
Bean的作用域
bean的作用域是通过scope属性来描述bean的。
- (1)Singleton : 单列; 代表spring容器中只有一个bean的实例 (默认的scope属性)
- (2)Prototype: 多列; 每一次从spring容器中获取时,都会返回一个新的实例。
- (3)Request: 用在web开发中,将bean对象 request. setAttribute()存储在request域中。
- (4)Session : 用在web开发中,将bean对象 session.setAttribute()存储在session域中。
Bean的声明周期
分情况:
- 单例:
容器创建,对象就生成;只要容器存在,对象就一直存在;容器销毁,对象消亡。 - 多例:
每次使用都会创建新的对象;只要对象在使用,就一直存在;当对象长时间不被使用,就由java进行垃圾回收。
三、注解开发
使用注解开发需要在配置文件中进行配置注解;
<!-- 开启注解开发 -->
<context:annotation-config/>
<!-- 在类中写了注解。还需要进行包的扫描找到 -->
<context:component-scan base-package="dao"></context:component-scan>
base-package:是扫描需要注解的包的全包名路径
注解标签
-
创建Bean的注解
(1)@Componet 在当前的bean不知道在那一层的时候使用
(2)@Repository 用于dao层。
(3)@Service 用于service层。
(4)@Controller 用于表现层。 -
注入注解
(1)@Value("") 简单注入:
可以在变量属性中注入,也可以在setter方法中注入。 (写在属性中,可以不创建get、set方法)
(2)@ Autowired 复杂注入:自动装配。
(默认是根据类型来装配的。如果在容器中类型不唯一,就把变量名作为bean的id,在容器中查找,找到成功注入。否则,报错)
(3)@ Qualifier("") 预防多个bean自动装配分别不了。
在自动在按照类型注入的基础上,再按照bean的id注入。
(4)@Resource(name = “”)
直接按照bean的id注入。 -
其他注解
(1)@Scope(" ") 其实这个属性和想xml中的bean的Scope属性的配置。可以设置为 单列、多列等。
(2)@PostConstruct 初始化;
(3)@PreDestroy 销毁方法;
四、spring在web中的应用
需要导入spring-web的jar包
- 在web.xml中配置监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这个ContextLoaderListener实现了servletContextListener接口,在这个监听器中,当服务器启动时,
会找applicationContext对象,其实它是一个实现类webApplicationContext对象存入servletContext中。
- 在web.xml中配置applicationContext.xml配置文件
默认情况下,会在WEB-INF目录下找applicationContext文件。如果该路径下没有这个文件,则,就需要进行配置。
//classpath: 配置文件的路径。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/application.xml</param-value>
</context-param>
五、junit测试
需要导入spring-text的jar包。可以进行Junit测试
@RunWith(SpringJUnit4ClassRunner.class) //使用RunWith 然后找到配置文件
@ContextConfiguration(locations = "classpath:spring/application.xml")
public class text {
@Autowired //使用动态装配进行
ways way; //需要装配的类
@Test //需要
public void texting() {
way.text(); //需要测试的方法。
}
}