一、注解方式创建对象IOC
从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。实现起来就是通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。
@Component 放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中该注解有三个子注解
- @Controller 用于实例化controller层bean
- @Service 用于实例化service层bean
- @Repository 用于实例化持久层bean
当不确定是哪一层,就用Component这几个注解互相混用其实也可以,但是不推荐
1.1.在applicationContext.xml中配置开启注解扫描
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--添加注解扫描,指定扫描的包,将包中的所有注解的类实例化,产生对象 需要注意,注解扫描后产生的bean的id默认是 类名首字母小写,也可以通过注解指定bean的名,例如 @Component("user1") base-package:指定扫描的包,如果有多个包,可以写上一层的包名,或者 com.augus01,com.augus02 --> <context:component-scan base-package="com.augus"></context:component-scan> </beans>
1.2.在类上添加注解
spring容器会给我们创建bean实例并存储于容器中
package com.augus; import org.springframework.stereotype.Component; //在类上添加注解,让spring容器给我们创建bean实例并存储于容器中,可以通过value指定bean的id,不指定则默认是类名小写 @Component //@Component(value = "user") public class User { private Integer userid; private String username; private String password; @Override public String toString() { return "User{" + "userid=" + userid + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } public User() { System.out.println("第一步:user构造"); } public void initUser(){ System.out.println("第三步:初始化user"); } public void destoryUser(){ System.out.println("第五步:User销毁"); } public User(Integer userid, String username, String password) { this.userid = userid; this.username = username; this.password = password; } public Integer getUserid() { return userid; } public void setUserid(Integer userid) { System.out.println("第二步:user对象属性赋值"); this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
1.3.组件扫描配置注解识别:补充一般不需要
这里可以设置只扫描某一个或者多个注解,也可以设置不扫描某一个或多个注解
<!-- use-default-filters 默认值为true 代表使用默认的扫描过滤器 默认的扫描过滤器会识别并包含 @Component @Controller @Service @Repository 四个注解 不使用默认的filter,使用我们自己的filter --> <!--控制只扫描Controller注解--> <context:component-scan base-package="com.augus" use-default-filters="false"> <!-- nclude-filter 扫描那个注解 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--控制不扫描Controller注解--> <context:component-scan base-package="com.augus" use-default-filters="true"> <!-- 不扫描那个注解:exclude-filter --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
1.4.测试代码
import com.augus.User; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test7 { @Test public void testGetBean(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext7.xml"); // 获取对象 , 并且输出其属性的值 User user = context.getBean("user", User.class); System.out.println(user); } }
二、注解方式实现依赖注入DI
注解的方式实现依赖注入主要使用一下几个注解完成:
- @Autowired 根据属性数据类型自动装配
- @Qualifier 根据属性名称注入依赖
- @Resources 可以根据类型,也可以根据名称注入
- @Value 注入普通数据类型(8+String)
1.创建项目,项目结构如下
2.创建接口和实体类
package com.augus.dao; public interface UserDao { void add(); }
package com.augus.dao.impl; import com.augus.dao.UserDao; import org.springframework.stereotype.Repository; //加上@Repository注解 自动产生UserDaoImplA bean对象 @Repository public class UserDaoImplA implements UserDao { @Override public void add() { System.out.println("这是UserDaoImplA"); } }
package com.augus.dao.impl; import com.augus.dao.UserDao; import org.springframework.stereotype.Repository; //加上@Repository注解 自动产生UserDaoImplB bean对象 @Repository public class UserDaoImplB implements UserDao { @Override public void add() { System.out.println("这是UserDaoImplB"); } }
package com.augus.service; public interface UserService { void add(); }
package com.augus.service.impl; import com.augus.dao.UserDao; import com.augus.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; //加上@Service注解 自动产生UserServiceImpl bean对象 @Service public class UserServiceImpl implements UserService { /* * 根据类型到容器中去寻找对应的对象,找到后给当前属性赋值 * 不需要依赖 set方法 * 属性类型可以是接口,会自动匹配对应的实现类对象 * @Autowired配合 @Qualifier,可以通过名称指定注入的对象 **/ @Autowired @Qualifier("userDaoImplB") //这里面userDao赋值的的时候,发现有两个实现类的对象,这时候就要区分这一次给谁赋值,不然会报错 private UserDao userDao; //给普通数据类型直接赋值,这个不要用,以后那些值我们不确定 // @Value("张无忌") // private String sname; // @Value("男") // private String sgender; // @Value("34") // private Integer sage; /*利用applicationContext.xml中读取出来的配置文件info.properties中的 值注入给下面的属性 *@Value 可以个普通属性赋值 *@Value 可以使用${}这种表达式获取系统的变量值 * 或者是获取.properties属性配置文件中的值 * */ @Value("${name}") private String sname; @Value("${gender}") private String sgender; @Value("${age}") private Integer sage; @Override public void add() { System.out.println("这是UserServiceImpl"); System.out.println(sname); System.out.println(sgender); System.out.println(sage); userDao.add(); } }
3.创建配置文件
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!--开启注解扫描--> <context:component-scan base-package="com.augus"></context:component-scan> <!--从配置文件info.properties中读取内容 读取出来变量,可以注入给属性 --> <context:property-placeholder location="classpath:info.properties"></context:property-placeholder> </beans>
4.创建.properties文件,从中读取内容给赋值给属性
创建info.properties文件,内容如下:
name=李岩 gender=男 age=34
注意,这里面有中文,在idea中控制台输出会有乱码,所以需要设置一下
5.测试
import com.augus.service.impl.UserServiceImpl; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test1 { @Test public void testGetBean(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserServiceImpl userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class); //调用对象的方法 userServiceImpl.add(); } }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/253688.html