注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样
1.创建Maven项目
2.在pom.xml中配置打包方式
jar
3.在pom.xml中配置spring依赖
org.springframework
spring-context
5.0.2.RELEASE
作用:
把资源让 spring 来管理。相当于在 xml 中配置一个 bean
属性:
value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写
这三个注解的功能与使用方法等同于@Component注解,只不过有以下行业规则:
@Controller: 一般用于表现层的注解。
@Service: 一般用于业务层的注解。
@Repository: 一般用于持久层的注解。
只能注入其他bean类型的数据,而基本类型和String类型无法通过本注解实现
集合类型的注入只能通过XL来实现
作用:
自动按照类型注入。只要容器中有唯一的一个bean对象类型与之匹配,就可以注入成功;当使用注解注入属性时, set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id
作用位置:
①类属性
②类方法
举例:
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Array;
import java.util.*;
/**
* 持久层实现类
*/
/**
* 创建AccountDaoImpl对象的注解
*/
@Component
public class AccountDaoImpl implements IAccountDao {
private String[] myStr;
private List myList;
private Set mySet;
private Map myMap;
private Properties myPro;
}
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 业务层实现类
*/
@Component
public class AccountServiceImpl implements IAccountService {
/**
* 将已经创建的AccountDaoImpl对象注入变量的注解
*/
@Autowired
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
}
只能注入其他bean类型的数据,而基本类型和String类型无法通过本注解实现
集合类型的注入只能通过XL来实现
作用:
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用
属性:
value:指定 bean 的 id
例如:
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 业务层实现类
*/
@Component
public class AccountServiceImpl implements IAccountService {
@Autowired
@Qualifier(value = "accountDaoImpl")
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
}
只能注入其他bean类型的数据,而基本类型和String类型无法通过本注解实现
集合类型的注入只能通过XL来实现
作用:
直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型
属性:
name:指定 bean 的 id
例如:
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
/**
* 业务层实现类
*/
@Component
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDaoImpl")
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
}
可以注入基本类型和String类型
集合类型的注入只能通过XL来实现
可以使用EL表达式
作用:
注入基本数据类型和 String 类型数据的
属性:
value:用于指定值
例如:
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.lang.reflect.Array;
import java.util.*;
/**
* 持久层实现类
*/
@Component
public class AccountDaoImpl implements IAccountDao {
/**
* 经过Value注解后,myStr的值就是数组{1, 2, 3, 4, 5, 6}了
*/
@Value(value = "{1, 2, 3, 4, 5, 6}")
private String[] myStr;
}
作用:
指定 bean 的作用范围
属性:
value的取值范围:
例如:
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
/**
* 业务层实现类
*/
@Component
@Scope(value = "singleton")
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDaoImpl")
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
}
作用:
用于指定初始化方法
作用:
用于指定销毁方法
例如:
package com.huhai.Service.Impl;
import com.huhai.Dao.IAccountDao;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.util.Date;
/**
* 业务层实现类
*/
@Component
@Scope(value = "singleton")
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDaoImpl")
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
@PostConstruct
private void init(){
System.out.println("对象创建");
}
@PreDestroy
private void destroy(){
System.out.println("对象被销毁");
}
}
package com.huhai;
import com.huhai.Service.IAccountService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Realize {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountServiceImpl", IAccountService.class);
as.save();
ac.close();
}
}
1.在resources目录下新建并编辑bean.xml配置文件如下:
文件内容可以参考API文档
spring-framework-5.0.2/spring-framework-5.0.2.RELEASE-docs/spring-framework-reference/core.html#spring-core
2.被配置文件中添加标签告知spring在创建容器时要扫描的包
4.持久层接口
package com.huhai.Dao;
/**
*持久层接口
*/
public interface IAccountDao {
public abstract void save();
}
5.持久层接口实现类
package com.huhai.Dao.Impl;
import com.huhai.Dao.IAccountDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.lang.reflect.Array;
import java.util.*;
/**
* 持久层实现类
*/
@Repository
public class AccountDaoImpl implements IAccountDao {
@Value(value = "{1, 2, 3, 4, 5, 6}")
private String[] myStr;
private List myList;
private Set mySet;
private Map myMap;
private Properties myPro;
public void save() {
System.out.println(Arrays.toString(myStr));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myPro);
}
}
6.业务层接口
package com.huhai.Service;
/**
*业务层接口
*/
public interface IAccountService {
public abstract void save();
}
7.业务层接口实现类
package com.huhai.Service.Impl;
import com.huhai.Dao.Impl.AccountDaoImpl;
import com.huhai.Service.IAccountService;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.util.Date;
/**
* 业务层实现类
*/
@Service
@Scope(value = "singleton")
public class AccountServiceImpl implements IAccountService {
@Resource(name = "accountDaoImpl")
private AccountDaoImpl accountDao;
public void save() {
accountDao.save();
}
@PostConstruct
private void init(){
System.out.println("对象创建");
}
@PreDestroy
private void destroy(){
System.out.println("对象被销毁");
}
}
8.表现层
package com.huhai;
import com.huhai.Service.IAccountService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
@Controller
public class Realize {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountServiceImpl", IAccountService.class);
as.save();
ac.close();
}
}
基于注解的 IoC 配置已经完成,但是有一个问题:我们依然离不开 spring 的 xml 配置文件,那么能不能不写这个 bean.xml,所有配置都用注解来实现呢?,下篇博文继续介绍