1. HelloWorld
- * 引入依赖
- * 开启组件扫描
- * 使用注解定义 Bean
- * 依赖注入
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只能有一个