bean.xml
<!--spring的依赖注入
注入的方式有三种:
1,使用构造函数注入
2,使用set方法注入
3.使用注解注入
注入的数据类型有三种:
1,基本类型和string类型
2,其他bean类型
3,复杂类型(集合类型)
-->
<!-- 构造函数注入
标签:constructor-arg
涉及的属性:
type:指定参数的类型
index:指定参数的索引位置,从0开始
name:指定参数的名称
==========上面三个属性是指定给哪个参数赋值,下面两个属性是指定给参数赋什么值===================
value:指定基本数据类型或string类型的数据
ref:指定其他bean类型数据
-->
<bean id="customerService" class="service.impl.CustomerServiceImpl">
<constructor-arg name="name" value="user"></constructor-arg>
<constructor-arg name="password" value="123"></constructor-arg>
<constructor-arg name="customerDao" ref="customerDao"></constructor-arg>
</bean> <bean id="customerDao" class="dao.impl.CustomerDaoImpl"></bean>
CustomerServiceImpl.class
public class CustomerServiceImpl implements CustomerService {
private String name;
private String password;
private CustomerDao customerDao;
/*
* 构造函数注入
* 提供构造函数让参数注入
*/
public CustomerServiceImpl(String name, String password,CustomerDao customerDao) {
this.name = name;
this.password = password;
this.customerDao = customerDao;
}
public void saveCustomer(){
System.out.println("业务层调用持久层 "+name+" "+password);
customerDao.saveCustomer();
}
}
bean.xml
<!-- set方法注入
name:指定参数的名称
value:指定基本数据类型或string类型的数据
ref:指定其他bean类型数据
-->
<!-- <bean id="customerService" class="service.impl.CustomerServiceImpl">
<property name="name" value="user"></property>
<property name="password" value="123"></property>
<property name="customerDao" ref="customerDao"></property>
</bean> -->
CustomerServiceImpl.class
public class CustomerServiceImpl implements CustomerService {
private String name;
private String password;
private CustomerDao customerDao;
public void saveCustomer(){
System.out.println("业务层调用持久层 "+name+" "+password);
customerDao.saveCustomer();
}
/* set方法注入
* 生成set方法以让数据注入
*/
/* public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
*/
}
bean.xml
<!-- 当配置了注解之后,要告知spring在创建容器时要扫描的包,配置了该标签后,spring才会去指定的包以及其子包下找相应的注解
-->
<context:component-scan base-package="service"></context:component-scan>
<context:component-scan base-package="dao"></context:component-scan>
CustomerServiceImpl.class
/*
*
* 注解:
* <bean id="customerService" class="service.impl.CustomerServiceImpl"></bean>
* 创建bean对象
* @Component
* 作用相当与配置一个bean标签,有一个id属性,默认为首字母小写的类名
* 由此注解衍生了的三个注解:
* @Controller 用于表现层的注解
* @Service 用于业务层的注解
* @Repository 用于持久层的注解
* 它们和@Component的作用和属性一模一样
* 注入数据:
* @Autowired
* 作用:自动按照类型注入
* 如果注入的bean在容器中类型不唯一,即一个接口有多个实现类,它会把变量名作为bean的id,在容器中查找,找到后也能注入成功
* 如果没有找到一致的id,就会报错
* @Qualifier
* 作用:在自动按照类型注入的基础上,再按照bean的id注入
* 属性:
* value:用于指定bean的id
* @Resource
* 作用:直接按照id进行注入
* 属性:
* name:用于指定bean的id
* 以上三个注解都是用于注入其他bean类型,而注入基本数据类型和string类型用@Value
* @Value
* 属性:
* value:用于指定要注入的数据
* 它可以借助spring中的el${}表达式读取properties文件中的配置
*
* 改变作用范围:
* @Scope
* 作用:用于改变bean的作用范围
*
*/
@Service("customerServiceImpl")
public class CustomerServiceImpl implements CustomerService {
@Value("aaa")
private String name;
@Value("123")
private String password;
//@Resource(name="customerDaoImpl")
//@Qualifier("customerDaoImpl")
@Autowired
private CustomerDao customerDao;
public void saveCustomer(){
System.out.println("业务层调用持久层 "+name+" "+password);
customerDao.saveCustomer();
}
}
bean.xml文件可以用一个class代替
/*
* 一个spring的配置类,相当于bean.xml
*/
//@Configuration//他就是把当前类看出spring的配置类,一般也可以不用
@ComponentScan({"service","dao"})
public class SpringConfiguration {
}