欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springIOC基于注解开发

程序员文章站 2022-07-12 23:02:43
...

三.IOC基于注解开发
1.导包
核心包:spring-beans-4.2.4.RELEASE.jar,spring-context-4.2.4.RELEASE.jar,spring-core-4.2.4.RELEASE.jar,spring-expression-4.2.4.RELEASE.jar
日志包:com.springsource.org.apache.commons.logging-1.1.1.jar 日志规范
com.springsource.org.apache.log4j-1.2.15.jar 日志实现
aop包:spring-aop-4.2.4.RELEASE.jar
同时日志还需要log4j.properties 配置文件

2.配置
需要在applicationContext.xml文件中开启注解扫描,让spring去扫描指定位置下的类。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 告知spring在创建容器时要扫描的包。当配置了此标签之后,spring创建容器就会去指定的包及其子包下找对应的注解
        标签是在一个context的名称空间里,所以必须在约束中导入context名称空间
    -->
    <context:component-scan base-package="com.itheima"></context:component-scan>
</beans>

3.注解分类

1.用于创建bean对象
@Component
作用:就相当于配置了一个bean标签,交给spring来管理
它能出现的位置:类上面
属性:value。指定bean的id,当不写时,它有默认值,默认值是:当前类的短名首字母小写(例如类名ICustomerServiceImpl,那么bean名iCustomerServiceImpl)
由此注解衍生的三个注解和@Component作用一样:
@Controller 一般用于表现层(web层)的注解
@Service 一般用于业务层(service层)的注解
@Repository 一般用于持久层(dao层)的注解
2.用于注入数据的
当我们使用注解注入时,类中可以去掉set方法
@Autowired
作用:自动按照类型注入(spring会在容器中寻找满足被注入对象类型的bean进行注入),当spring容器中这个类型的bean多于一个时,则报错
@Qualifier
作用:在自动按照类型注入的基础之上,再按照bean的id注入。它给类成员注入数据时,不能独立使用(要配合@Autowired)。但是再给方法的形参注入数据时,可以独立使用
属性:
value:用于指定bean的id
@Resource(name = “customerDao”)
作用:直接按照bean的id注入
@Value
作用:用于注入基本类型和String类型。它可以借助spring的el表达式读取properties文件中的配置
3.用于改变作用范围的
@Scope(“prototype”)
作用:用于改变bean的作用范围
属性:
value:用于指定范围的取值
取值和xml中scope属性的取值是一样的。singleton prototype request session globalsession
4.和生命周期相关的

	@PostConstruct	相当于 init-method
	@PreDestroy		相当于 destroy-method

eg

@Controller("userAction")
public class UserAction {

    @Resource(name = "userService")
    private UserService userService;

    @PostConstruct
    public void init(){
        System.out.println("初始化方法");
    }

    public void save(){
        System.out.println("action save方法");
        userService.add();
    }

    @PreDestroy
    public void destory(){
        System.out.println("销毁方法");
    }
}


eg
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 告知spring在创建容器时要扫描的包。当配置了此标签之后,spring创建容器就会去指定的包及其子包下找对应的注解
        标签是在一个context的名称空间里,所以必须在约束中导入context名称空间
    -->
    <context:component-scan base-package="com.itheima"></context:component-scan>
</beans>

// 指定类交给spring来创建,指定bean的id为customerService
@Service("customerService")
@Scope("prototype")
public class ICustomerServiceImpl implements ICustomerService {
//    @Autowired
//    @Qualifier("customerDao")
    @Resource(name = "customerDao")
    private ICustomerDao customerDao;

    @Value("miralce")
    private String name;

    @Override
    public void saveCustomer() {
        System.out.println("业务层调用持久层" + name);
        customerDao.saveCustomer();
    }
}

@Repository("customerDao")
public class ICustomerDaoImpl implements ICustomerDao {

    @Override
    public void saveCustomer() {
        System.out.println("持久层保存了客户");
    }
}