1. Spring的IOC的注解开发
1.1.创建web项目,引入jar包
在Spring4的版本中,除了基本的四个核心包➕两个日志文件包➕一个AOP的包(多引入这个)
1.2 引入Spring的配置文件
- 1.在src下创建applicationContext.xml
- 2.引入约束
<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">
<!--Spring的IOC的注解的入门 -->
<!--使用IOC注解开发,配置扫描 就是配置哪些包需要配置注解-->
<context:component-scan base-package="spring.demo1">
</context:component-scan>
</beans>
- 3.在类上添加注解
package spring.demo1;
//用户DAO的实现类
import org.springframework.stereotype.Component;
//下面相当于<bean id="userDao" class="spring.demo1"/>
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("Dao中的save方法执行了。。");
}
}
- 4.编写测试类
//spring的IOC注解开发
@Test
public void demo2() {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao) applicationContext.getBean("userDao");
userDao.save();
}
1.3注解方式设置属性的值
- 使用注解方式,可以没有set方法的
- 属性如果有set方法,需要将属性注入的注解添加到set方法上。
- 属性如果没有set方法,需要将属性注入的注解添加在属性上
package spring.demo1;
import org.springframework.beans.factory.annotation.Value;
//用户DAO的实现类
import org.springframework.stereotype.Component;
//下面相当于<bean id="userDao" class="spring.demo1"/>
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Value("lijia")
private String name;
/*
* public void setName(String name) {
* this.name = name;
* }
*/
@Override
public void save() {
System.out.println("Dao中的save方法执行了。。" + name);
}
}
1.4Spring的IOC的注解的详解
1.4.1 @Component :组件
- 修饰一个类,将这个类交给Spring管理
- 这个注解有三个衍生注解(功能类似)
- @Controller : web层
- @Service : service层
- @Repository :dao层
1.4.2属性注入的注解
- 普通属性
- @Value : 设置普通属性的值
- 对象类型属性
- @Autowired : 设置对象类型的属性的值,但是按照类型完成属性注入
- 习惯是按照名称完成属性注入,必须让@Autowired注解和@Qualifier一起使用完成属性注入。
- @Resource :完成对象类型的属性的注入,按照名称晚上属性注入
package spring.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
//下面相当于<bean id="userDao" class="spring.demo1"/>
//@Component("userDao")
@Repository("userDao11")
public class UserDaoImpl implements UserDao {
@Value("lijia")
private String name;
/*
* public void setName(String name) {
* this.name = name;
* }
*/
@Override
public void save() {
System.out.println("Dao中的save方法执行了。。" + name);
}
}
package spring.demo1;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
/* @Autowired // 注入DAO
@Qualifier(value="userDao11")
*/
@Resource(name="userDao11")
private UserDao userDao;
@Override
public void save() {
System.out.println("UserServiceImpl的save方法执行了");
userDao.save();
}
}
@Test
public void demo3() {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService) applicationContext.getBean("userService");
userService.save();
}
1.5 Bean 的生命周期的注解(不重要)
-
两个注解:
- @PostConstruct : 初始化方法
- @PreDestroy : 销毁方法
-
1.配置文件
<?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">
<!--Spring的IOC的注解的入门 -->
<!--使用IOC注解开发,配置扫描 就是配置哪些包需要配置注解-->
<context:component-scan base-package="spring.demo1,spring demo2"></context:component-scan>
<!--可以扫描多个包,也可以扫描子包 base-packeage="spring"即可 -->
</beans>
- 2.编写类
package spring.demo2;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Service;
//<bean id="" class="" init-method="init" destroy-method="destroy">
@Service("customerService")
public class CustomerService {
@PostConstruct //相当于init-method
public void init() {
System.out.println("CustomerService的init方法执行了。。。");
}
public void save() {
System.out.println("CustomerService的save方法执行了。。。");
}
@PreDestroy //相当于destroy-method
public void destroy() {
System.out.println("CustomerService的destroy方法执行了。。。");
}
}
-
- 编写测试类
package spring.demo2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testdemo2 {
@Test
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
customerService.save();
// 要想执行destroy方法,必须使用子类对象和关闭applicationContext方法
/*
* ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); CustomerService
* customerService = (CustomerService)applicationContext.getBean("customerService");
* applicationContext.close();
*/
}
}
1.6 IOC和XML注解比较
-
XML:适用于任何场景
-
注解: 有些地方不适用,比如这个类不是自己提供的
-
纯XML配置的方式
编写order类
package spring.demo3;
public class OrderDao {
public void save() {
System.out.println("OrderDao执行了");
}
}
编写product类
package spring.demo3;
public class ProductDao {
public void save() {
System.out.println("ProductDao执行了");
}
}
编写ProductService类
package spring.demo3;
public class ProductService {
private ProductDao productDao;
private OrderDao orderDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
public void save() {
System.out.println("ProductService执行了");
productDao.save();
orderDao.save();
}
}
配置XML文件
<bean id="productService" class="spring.demo3.ProductService">
<property name="productDao" ref="productDao"></property>
<property name="orderDao" ref="orderDao"></property>
</bean>
<bean id="productDao" class="spring.demo3.ProductDao"></bean>
<bean id="orderDao" class="spring.demo3.OrderDao"></bean>
编写测试类
package spring.demo3;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testdemo3 {
@Test
public void demo1() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
ProductService productService = (ProductService) applicationContext.getBean("productService");
productService.save();
}
}
IOC 和XML整合开发
<!--在没有扫描的情况下,可以使用属性注入注解@Resource @Value @Autowired @Qualifier -->
<context:annotation-config></context:annotation-config>
@Resource(name="productDao")
private ProductDao productDao;
@Resource(name="orderDao")
private OrderDao orderDao;