1:编写applicationContext.xml文件,告诉ioc容器扫描哪些路径下的包
<!--指定扫描包路径下的注解-->
<context:component-scan base-package="com.jcf.api" >
</context:component-scan>
<!--引用外部属性资源文件 可以通过@Value来获取里面的key值-->
<context:property-placeholder location="db.properties"></context:property-placeholder>
2:在对应的类上写上对应的注解
@Controller:控制器,推荐给controller层添加此注解
@Service:业务逻辑,推荐给业务逻辑层添加此注解
@Repository:仓库管理,推荐给数据访问层添加此注解
@Component:给不属于以上基层的组件添加此注解
@Lazy 当对象在被使用时,再加载实例化
@DependsOn("user") 某对象是实例要依赖其他对象(其他对象先实例,自己在实例)
@Scope("prototype") 实现多例
注意:我们虽然人为的给不同的层添加不同的注解,但是在spring看来,可以在任意层添加任意注解
spring底层是不会给具体的层次验证注解,这样写的目的只是为了提高可读性,最偷懒的方式
就是给所有想交由IOC容器管理的bean对象添加component注解
3:@Value 设置属性
//1.硬编码
@Value("邓紫棋")
private String name;
//2.引用别的对象设置对象属性
@Value("#{role.name}")
private String name;
//3.引用外部资源文件设置对象属性
@Value("${mysql.username}")
private String name;
4:@Autowired 自动注入
4.1 @Autowired 作用在成员变量上
注意:当使用AutoWired注解的时候,自动装配的时候是根据类型实现的。
- 如果只找到一个,则直接进行赋值,
- 如果没有找到,则直接抛出异常,
- 如果找到多个,那么会按照变量名作为id继续匹配,
- 匹配上直接进行装配
- 如果匹配不上则直接报异常
- 还可以使用@Qualifier注解来指定id的名称,让spring不要使用变量名,
4.2 @Autowired 作用在方法上
/**
* 当方法上有@AutoWired注解时:
* 1、此方法在bean创建的时候会自动调用
* 2、这个方法的每一个参数都会自动注入值
* @param personDao
*/
@Autowired
public void test(PersonDao personDao){
System.out.println("此方法被调用:"+personDao);
}
/**
* @Qualifier注解也可以作用在属性上,用来被当作id去匹配容器中的对象,如果没有
* 此注解,那么直接按照类型进行匹配
* @param personService
*/
@Autowired
public void test2(@Qualifier("personServiceExt") PersonService personService){
System.out.println("此方法被调用:"+personService);
}
4.3 自动装配的注解@AutoWired,@Resource区别
- @AutoWired:是spring中提供的注解,@Resource:是jdk中定义的注解,依靠的是java的标准
- @AutoWired默认是按照类型进行装配,默认情况下要求依赖的对象必须存在,@Resource默认是按照名字进行匹配的,同时可以指定name属性。
- @AutoWired只适合spring框架,而@Resource扩展性更好
5:泛型依赖注入
package com.jcf.api.dao;
import org.springframework.stereotype.Repository;
/**
* Author: jcf
* Date: 2020/9/25 7:50
* Description:
*/
@Repository
public abstract class BaseDao<T> {
public abstract void save();
}
import com.jcf.api.dao.BaseDao;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Author: jcf
* Date: 2020/9/25 7:55
* Description:
*/
public class BaseService<T> {
@Autowired
BaseDao<T> baseDao;
public void save(){
System.out.println("自动注入的对象:"+baseDao);
baseDao.save();
}
}
package com.jcf.api.service.impl;
import com.jcf.api.beans.Role;
import com.jcf.api.service.BaseService;
import org.springframework.stereotype.Service;
/**
* Author: jcf
* Date: 2020/9/25 7:58
* Description:
*/
@Service
public class RoleServiceImpl extends BaseService<Role>{
}
@Controller
public class UserController {
/**
*泛型依赖注入
*/
@Autowired
RoleServiceImpl roleServicel;
public void save(){
roleServicel.save();
}
}