当前位置: 首页> 文旅> 文化 > Spring:IoC容器(基于注解管理bean)

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

时间:2025/7/12 9:06:43来源:https://blog.csdn.net/2301_79526467/article/details/139159335 浏览次数:0次

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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://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.完成依赖注入

 @Testpublic 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;@Overridepublic void show() {userDao.show();System.out.println("userService...");}
}
@Repository
public class UserDaoImp implements UserDao{@Overridepublic 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方法自动注入*/@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
/**** 2.根据set方法完成自动注入*/@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}

2.3 根据构造器自动注入

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

2.4 通过形参自动注入

/**** 4.通过形参注入*/public UserController(@Autowired UserService userService) {this.userService = userService;}
/**** 4.通过形参注入*/@Autowiredpublic 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是属性名。@Resourceprivate UserDao myUserDaoImp;@Overridepublic void show() {myUserDaoImp.show();System.out.println("userService...");}
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {@Overridepublic 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只能有一个

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: