Spring:IoC容器(基于注解管理bean)

1. HelloWorld 

  1. * 引入依赖
  2. * 开启组件扫描
  3. * 使用注解定义 Bean
  4. * 依赖注入

2.开启组件扫描 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描功能-->
    <!--<context:component-scan base-package="com.itgyl.bean"></context:component-scan>-->
    <context:component-scan base-package="com.itgyl.bean"></context:component-scan>
</beans>

 3.创建bean

@Component//该注解效果等同于<bean id="user" class="...">如果写value创建bean对象值默认使用开头字母为小写的类名
public class User {

}

4.完成依赖注入

 @Test
    public void testUser() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        System.out.println(context);

        //获取bean时会自动完成依赖注入
        User user = context.getBean(User.class);
        System.out.println(user);
    }

 2. @Autowire注入

2.1 根据属性自动注入 

以MVC架构模式为栗 

@Controller
public class UserController {
    /***
     * 1.根据属性自动注入
     */
    @Autowired //根据类型找到对应对象完成自动注入
    private UserService userService;

    public void show() {
        userService.show();
        System.out.println("controller...");
    }
}
@Service
public class UserServiceImp implements UserService{
    /***
     * 1.根据属性完成自动注入
     */
    @Autowired //该注解会通过类型找到对应的对象完成注入
    private UserDao userDao;

    @Override
    public void show() {
        userDao.show();
        System.out.println("userService...");
    }
}
@Repository
public class UserDaoImp implements UserDao{
    @Override
    public void show() {
        System.out.println("userDao...");
    }
}

基于全注解配置IoC容器,把xml的配置文本用类来代替

@Configurable   //基于全注解创建IoC容器配置一个类,该类加上两个注解,注解@Configurable即该类为配置类
@ComponentScan("com.itgyl.autowired") //@ComponentScan注解里面的路径即从哪个包开始扫描自动注入bean
public class SpringConfig {
}
public class TestAutoWired {
    public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);

        UserController userController = context.getBean(UserController.class);
        userController.show();
    }
}

2.2 根据set方法自动注入

/***
     * 2.根据set方法自动注入
     */
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
/***
     * 2.根据set方法完成自动注入
     */
    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

2.3 根据构造器自动注入

/***
     * 3.根据构造器完成自动注入
     */
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
/***
     * 3.根据构造器完成自动注入
     */
    @Autowired
    public UserServiceImp(UserDao userDao) {
        this.userDao = userDao;
    }

2.4 通过形参自动注入

/***
     * 4.通过形参注入
     */
    public UserController(@Autowired UserService userService) {
        this.userService = userService;
    }
/***
     * 4.通过形参注入
     */
    @Autowired
    public UserServiceImp(@Autowired UserDao userDao) {
        this.userDao = userDao;
    }

2.5 通过@AutoWire和@Qualifier注解完成注入

 @Autowired
    @Qualifier(value = "userServiceImp") //默认名字为开头首字母小写的类的名字
    private UserService userService;
@Autowired
    @Qualifier(value = "userDaoImp")
    private UserDao userDao;

总结

**总结**

* @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
* 当带参数的构造方法只有一个,@Autowired注解可以省略。()
* @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

3. @Resource注入 

 3.1 根据name注入

@Controller
public class UserController {

    //@Resource注解即该实例化对象源于哪name的值要和传递的实例化对象保持一致
    //指定值接收就按照该值找相应的实例化bean
    @Resource(name = "myUserService")
    private UserService userService;

    public void show() {
        userService.show();
        System.out.println("controller...");
    }
}

3.2 无name值注入

//@Service中value的值即要传递的实例化对象,接收时的值要和该值保持一致
@Service(value = "myUserService")
public class UserServiceImp implements UserService {

    //@Resource此时不指定name的值则使用属性中的变量名和传递的bean实例化对象相匹配,要求该属性名和值保持一致
    //当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。
    @Resource
    private UserDao myUserDaoImp;

    @Override
    public void show() {
        myUserDaoImp.show();
        System.out.println("userService...");
    }
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {
    @Override
    public void show() {
        System.out.println("userDao...");
    }
}
@Configurable
@ComponentScan("com.itgyl.resource")
public class SpringConfig {
}
public class TestResource {
    public static void main(String[] args) {
        //通过全注解方式获取管理对象的IoC容器
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);

        UserController u = context.getBean(UserController.class);
        u.show();
    }
}

总结

总结:**

@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

食懵你啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值