David Michael Gang David Michael Gang - 23 days ago 5
AngularJS Question

What is the type friendly injection?

In the AngularJS documentation, there is an explanation of the differences between a factory, a service, a value, a constant and a provider .

At the end, we have a comparison table:
Comparison table
One of the rows is "type friendly injection". I could not understand what it is.

What does that mean? Additionally, what does it mean that, in order that a value will have this "type friendly injection", is at the cost of "eager initialization by using new operator directly"?

Answer

In AngularJS, you can inject dependencies in multiple ways:

  • in the directive link function by position
  • in the directive definition by name
  • in the controller function by name
  • in the factory function by name
  • in the service function by type

Type friendly injection allows you to implicity invoke a constructor function by reference:

myApp.service('Pattern', ["Infinity", RegExp]);

rather than by explicity using the new keyword:

myApp.factory('Pattern', 
 ["Infinity", function(Infinity) 
  {
  return new RegExp(Infinity);
  } 
 ]);

OR

function goInfinity(Infinity)
  {
  return new RegExp(Infinity);
  } 

goInfinity.$inject = ["Infinity"];
myApp.factory('Pattern', goInfinity);

The Service recipe produces a service just like the Value or Factory recipes, but it does so by invoking a constructor with the new operator. The constructor can take zero or more arguments, which represent dependencies needed by the instance of this type.

Eager initialization means that a constant recipe must return a constructor in order to use the aforementioned syntax:

function RegExpConstant() 
  {
  return new RegExp(Infinity);
  } 

myApp.constant('Pattern', RegExpConstant)

rather than returning a function, object, or literal value.

The nomenclature comes from Java:

A service is a well-known set of interfaces. A service provider is a specific implementation of a service.

References