springIOC基于注解开发

三.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去扫描指定位置下的类。



    
    

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



    
    


// 指定类交给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("持久层保存了客户");
    }
}

你可能感兴趣的:(spring)