构造注入

如何给构造方法中的参数注入方法呢如下

首先bean代码如下

package cn.pojo;

public class Greeting {
/**
* 说的话
*/
private String words;
/**
* 说话的人
*/
private String person;
private Greeting greeting;
public void sayGreeting() {
System.out.println(person+"说:"+words);
}
public Greeting getGreeting() {
return greeting;
}
public void setGreeting(Greeting greeting) {
this.greeting = greeting;
}
public Greeting() {
// TODO Auto-generated constructor stub
}
public Greeting(String words1,String person1) {
this.words=words1;
this.person=person1;
}
public String getWords() {
return words;
}
public void setWords(String words) {
this.words = words;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
}

xml注入代码如下

<!-- id为实例后对象名 class为对象的类型 -->
<bean id="greeting1" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
</bean>

这段个代码跟下面这段Java代码的意思是一样的,实例化一个名叫 greeting1的对象并且传入两个参数 ,name则对应参数的名称

Greeting greeting1 = new Greeting("三天不打鬼子,手都不自在","小兵张嘎");

测试代码如下

    //找到配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
     Greeting greeting1 = (Greeting)context.getBean("greeting1");
greeting1.sayGreeting();

结果如下

注入属性

注入代码如下

  <bean id="greeting1" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
<!-- 此段代码相当于 实例化Greeting类后调用set方法对属性名为greeting的属性进行赋值,只不过赋值的类型是自定义的类类型-->
<property name="greeting" ref="greeting2"/>
</bean>
<bean id="greeting2" class="cn.pojo.Greeting">
<!--name为构造参数中的参数名称 value为值 给Greeting中的words和person赋值,相当于调用set方法进行赋值-->
<property name="words" value="世界上有十种人,认识二进制和不认识二进制的"/>
<property name="person" value="Rod"/>
</bean>

再编写bean时需要注意些setget方法,否则注入时将会出现异常

测试类代码

     //找到配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Greeting greeting1 = (Greeting)context.getBean("greeting1");
greeting1.getGreeting().sayGreeting();
greeting1.sayGreeting();

运行结果

p命名空间注入

  首先使用p需要导入 xmlns:p="http://www.springframework.org/schema/p" 才能使用 这个地址访问会出404不用管 是正常的可以用。注意区分大小写

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd ">

p命名空间简化了属性的注入,简化了配置的方法,大大的简化了配置的工作量 如下

  <!-- 对类类型的属性进行赋值分号后为  属性名加-ref 即 greeting-ref-->
<bean id="greeting1" class="cn.pojo.Greeting" p:greeting-ref="greeting2">
<!--name为构造参数中的参数名称 value为值 -->
<constructor-arg value="三天不打鬼子,手都不自在" name="words1"/>
<constructor-arg value="小兵张嘎" name="person1"/>
</bean>
<!-- 分号后面为 属性名称 -->
<bean id="greeting2" class="cn.pojo.Greeting"
p:words="世界上有十种人,认识二进制和不认识二进制的" p:person="Rod"/>

使用注解定义bean

  注意:如果是jdk1.8的最好不要用spring3,或者使用jdk1.7。否则很可能会出现不兼容,之前我就亲身经历了这个问题。于是我就换成了spring 4

jar下载网址:http://repo.spring.io/release/org/springframework/spring/

使用注解定义bean又进一步的减少了配置文件的代码量

首先定义一个接口然后仔定义实现类

//通过注解定义了一个dao,此注解相当于 实例化了一个名叫 userDao UserDaoImppl类型的对象,是跟在xml中定义了一个bean一样的效果
@Component("userDao")
public class UserDaoImpl implements UserDao { @Override
public void save(User u) {
System.out.println("保存用户信息到数据库!");
} }

编写业务层

//此注解相当于实例化了名为 userService的对象,也是跟xml定义了一个bean一样的效果
@Service("userService")
public class UserServiceImpl implements UserService{
//查找名为userDao的bean,并注入给dao属性
@Resource(name="userDao")
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao userDao) {
this.dao = userDao;
}
@Override
public void save(User u) {
// TODO Auto-generated method stub
dao.save(u);
} }

或者这样也是可以的

//此注解相当于实例化了名为 userService的对象
@Service("userService")
public class UserServiceImpl implements UserService{
//查找名为dao的bean,并注入给dao属性
@Autowired
@Qualifier("userDao")
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao userDao) {
this.dao = userDao;
}
}

或者这样

  @Autowired
private UserDao dao;

亦或者这样

  @Resource
private UserDao dao;

上述的几种方式结果都是一样的 @Resource和@Autowired默认会寻找符合条件的bean 而 @Component("userDao")正好满足。而他们的赋值是跟setget没有关系的即使去掉也

没得事

userConfig代码如下

<?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.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd ">
<!-- 扫描指定目录下的所有文件 可以直接写 所有包的“父亲”cn也可以 -->
<context:component-scan base-package="cn.dao.impl,cn.service.impl"/>
</beans>

测试类代码如下

   ApplicationContext context = new ClassPathXmlApplicationContext("userConfig.xml");
UserService userDao = (UserServiceImpl)context.getBean("userService");
User u = new User();
userDao.save(u);

结果如下

  • @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
  • @Repository:用于标注Dao类
  • @Service:用于标注业务类
  • @Controller:用于标注控制权类

它们的作用都是定义一个bean,看到不同的注解的时候可以方便区分此bean时干嘛用的。

多种方式实现依赖注入及使用注解定义bean的更多相关文章

  1. IOC和AOP使用扩展 多种方式实现依赖注入

    多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...

  2. Spring多种方式实现依赖注入

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  3. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)

    构造注入 语法: <constructor-arg>    <ref bean="bean的id"/> </constructor-arg> 1 ...

  4. Spring——多种方式实现依赖注入

    在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性.Spring会从这里获取必要的信息来创建bean. 但是,在XML中声明DI时,会有多种 ...

  5. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  6. SSM框架之Spring(3)IOC及依赖注入(基于注解的实现)

    Spring(3)IOC及依赖注入(基于注解的实现) 学习基于注解的 IoC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样 的,都是要降低程序间的耦合.只是配置的形 ...

  7. Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解

    一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...

  8. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  9. Spring_02 注入类型值、利用引用注入类型值、spring表达式、与类相关的注解、与依赖注入相关的注解、注解扫描

    注意:注入基本类型值在本质上就是依赖注入,而且是利用的set方式进行的依赖注入 1 注入基本类型的值 <property name="基本类型的成员变量名" value=&q ...

随机推荐

  1. UVALive - 4223(hdu 2926)

    ---恢复内容开始--- 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS ...

  2. Storm概念学习系列之Topology拓扑

    不多说,直接上干货!   Hadoop 上运行的是 MapReduce 作业,而在 Storm 上运行的是拓扑 Topology,这两者之间是非常不同的.一个关键的区别是:一个MapReduce 作业 ...

  3. 一步一步配置Spring

    https://blog.csdn.net/tangtong1/article/details/51442757

  4. vscode 插件todo-highlight

    简介 Highlight TODO,FIXME or any annotations within your code. 资源 https://marketplace.visualstudio.com ...

  5. 自定义HashMap的键

    用自定义的类型作为HashMap的key,必须同时重载hashCode()和equals(),才可以实现在HashMap中的查找自定义键. 例如自定义Point类: public class Poin ...

  6. IO模型与soketserver实现并发

    一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...

  7. 构建第一个Spring Boot2.0应用之集成mybatis、Druid(七)

    一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.说明:      本文综合之 ...

  8. OpenCV之cvAddWeighted直接C语言实现版addWeighted,应对上下平滑融合拼接

    关于OpenCV中的cvAddWeighted的介绍可参见<opencv中的cvAddWeighted函数> cvAddWeighted有个问题,它只能实现两张图片的直接融合,往往产生明显 ...

  9. 使用startForeground让android服务前台运行

    最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForegroun ...

  10. 更改placeholder样式

    /*不要将选择器进行组合*/ /* IE 10-11 */ :-ms-input-placeholder { color: #aaa; } /* webkit */ ::-webkit-input-p ...